zoukankan      html  css  js  c++  java
  • 归并排序

     并归排序就是将两个有序数组合成一个有序数组。

    所以需要先写一个合并数组的函数merge()来合并两个有序数组。这个函数应该没有问题,但如何得到两个有序数组呢?。。。。仔细想一下,得到两个有序数组的不就是分别对这两个数组归并排序吗?那么数组的数组怎么得到?任然是归并排序,直到数组中只剩下一个值了,就不用排序了,这又是一个递归过程。要想排序这数组,就先排序它的小数组,排序小数组,就先排序小小数组。。。所以我们应该先递归到数组只剩一个值了,然后再一层一层的合并数组,直到整个数组合并完成。

    #include"iostream"
    using namespace std;
    void show(int *a,int n){
        for(int i = 0;i < n;i++){
            cout<<a[i]<<ends;
        }
        cout<<endl;
    }
    void merge(int *a,int *b,int l,int center,int rend){
        int lend = center,r = center + 1,l1 = l,i = l;
        while(l <= lend && r <= rend){
            if(a[l] < a[r]){
                b[i++] = a[l++];
            }
            else{
                b[i++] = a[r++];
            }
        }
        while(l <= lend){
            b[i++] = a[l++];
        }
        while(r <= rend){
            b[i++] = a[r++];
        }
        for(int j = l1;j < i;j++){
            a[j] = b[j];
        }
    }
    void mSort(int *a,int *b,int l,int r){
        if(l < r){
            int center = (l + r) / 2;
            mSort(a,b,l,center);
            mSort(a,b,center + 1,r);
            merge(a,b,l,center,r);    //合并
        }
    }
    void mergeSort(int *a,int n){
        int *b = new int[n];    //这里申请一个临时数组来存小数组,避免后面频繁申请内存
        mSort(a,b,0,n - 1);        
        delete []b; 
    }
    
    int main(){
        const int n = 10;
        int a[n];
        for(int i = 0;i < n;i++){
            a[i] = n - i;
        }
        show(a,n);
        mergeSort(a,n);
        show(a,n);
        return 0;
    }
  • 相关阅读:
    第十五章:Android 调用WebService(.net平台)
    第十四章:样式(Style)和主题(Theme)
    第十三章:常用控件下
    第十三章:常用控件上
    第十二章:Android数据存储(下)
    第十一章:Android数据存储(上)
    第十章:Intent详解
    PHP7.X连接SQLSERVER数据库(CENTOS7)
    CentOs install oracle instant client
    softmax
  • 原文地址:https://www.cnblogs.com/oleolema/p/9097560.html
Copyright © 2011-2022 走看看