排序算法-归并排序

Posted erick-l

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法-归并排序相关的知识,希望对你有一定的参考价值。

算法思想:首先把一个数组中的元素,按照某一方法,先拆分了之后,按照一定的顺序各自排列,然后再归并到一起,使得归并后依然是有一定顺序的 。

算法可自顶向下拆分数组也可以自底向上拆分数组合并

自底向上的归并排序有对索引依赖少的优势,对于链表来说比较适合

//自底向上的归并排序
template<typename T>
void mergeSortBU(T arr[],int n){
    for(int sz = 1;sz <=n;sz += sz)
        for(int i=0;i+sz<n;i+=sz + sz)
            //对arr[i..i+sz-1]和arr[i+sz..i+2*sz-1]进行归并
            __mearge(arr,i,i+sz-1,min(i+sz+sz-1,n-1));
}

 

//归并排序子函数,将arr[l...mid]和arr[mid+1...r]两部分进行归并
template<typename T>
void __mearge(T arr[],int l,int mid,int r){
    T aux[r-l+1];
    for(int i=l;i<=r;i++)
        aux[i-l] = arr[i];
    int i =l,j=mid+1;
    for (int k=l;k<=r;k++)
        if(i >mid){
            arr[k] = aux[j-l];
            j++;
        }else if(j>r)
        {
            arr[k] = aux[i-l];
            i++;
        }
        
        if(aux[i-l] <aux[j-l]){
            arr[k] = aux[i-l];
            i++;
        }else
        {
            arr[k] = aux[j-l];
            j++;
        }
        
}

 

以上是关于排序算法-归并排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之归并排序

排序算法归并排序

Java 归并排序算法

Java 归并排序算法

十大经典排序算法总结(归并排序)

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(上)--递归方法实现