数据结构 归并排序 C++

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

时间复杂度 平均速度 O(N*logN) 稳定排序 #include 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);
            
        }
复制代码
  • ######看我那么可爱n(≧▽≦)n
  • 关注我的微薄 (梁同桌):http://weibo.com/tongrenyinsheng
  • 个人博客: http://www.liangtongzhuo.com
  • ios 个人写的app (同人音声)ASMR音乐

转载于:https://juejin.im/post/5a31f18e51882503dc53b88b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值