数据结构 归并排序 C++

个人对归并排序的理解
1.也是分治法
2.先拆分,拆分总序列, (先不考虑奇数)
第一次拆分为N个子序列, 每个子序列元素有1个,俩俩合并子序列
第二次拆分为N/2子序列,每个子序列元素有2个, 俩俩合并子序列
第三次拆分为N/4子序列,每个子序列元素有4个,俩俩合并子序列
----------n/2^n ------------------ 2^n
...最后拆分为2个子序列,每个子序列元素有N/2个,俩俩合并子序列,成为新的有序序列
3.因为拆分的子序列都是有序的,合并速度非常快。归并效率很高

时间复杂度
平均速度 O(N*logN)
稳定排序
#include <iostream>
using namespace std;

        void print(int a[], int n){
            for(int j= 0; j<n; j++){
                cout<<a[j] <<"  ";
            }
            cout<<endl;
        }

        //将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n]
        void Merge(int *r,int *rf, int i, int m, int n)
        {
            int j,k;
            for(k=i,j=m+1; i<=m && j <=n ; ++k){
                if(r[j] < r[i]) rf[k] = r[j++];
                else rf[k] = r[i++];
            }
            while(i <= m)  rf[k++] = r[i++];
            while(j <= n)  rf[k++] = r[j++];
        //    print(rf,n+1);
            

        }

        void MergeSort(int *r, int *rf, int lenght)
        {
            int len = 1;
            int *q = r ;
            int *tmp ;
            while(len < lenght) {

                len = 2 * len ;
                int i = 0;
                while(i+ len <lenght) {
                    Merge(q, rf,  i, i+ len/2 -1, i+ len-1 ); //对等长的两个子表合并
                    i = i+ len;
                }
                if(i + len/2 < lenght+1){ // 这里要+1
                    Merge(q, rf,  i, i+ len/2 -1, lenght -1); //对不等长的两个子表合并
                }
                tmp = q; q = rf; rf = tmp; //交换q,rf,以保证下一趟归并时,仍从q 归并到rf
            }
        }


        int main(){
            int a[19] = {3,1,5,7,2,4,9,6,8,0,20,3,5,6,7,-1,-1,-2,0};
            int b[19];
            MergeSort(a, b,19);
            cout<<"结果:";
            print(b,19);
            
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,287评论 0 2
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,469评论 1 4
  • 一、 单项选择题(共71题) 对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n ...
    貝影阅读 9,264评论 0 10
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,225评论 0 52
  • 【 男友力一:爱她就帮她清空购物车】 明明楼下超市就可以买到的东西,为什么女生偏要网购呢? 因为女人天生就是享受收...
    不爱说话的小喵阅读 543评论 0 0