归并排序

Posted

tags:

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

对于一个int数组,请编写一个归并排序算法,对数组元素排序。

给定一个int数组A及数组的大小n,请返回排序后的数组。

测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]

代码:

class MergeSort{
public:
    void Merge(int* A, int* tmpA, int L, int R, int RightEnd)   //归并
    {
        int LeftEnd=R-1;
        int Tmp=L;
        int num=RightEnd-L+1;
        while(L<=LeftEnd && R<=RightEnd){
            if(A[L]<=A[R])
                tmpA[Tmp++]=A[L++];
            else
                tmpA[Tmp++]=A[R++];
        }
        while(L<=LeftEnd)
            tmpA[Tmp++]=A[L++];
        while(R<=RightEnd)
            tmpA[Tmp++]=A[R++];
        for(int i=0; i<RightEnd; i++)
            A[i]=tmpA[i];
    }
     
    void divide(int* A, int* tmpA, int n, int length)   //划分 (非递归)
    {
        int i;
        for(i=0; i<n-length*2; i+=2*length)   //length为当前有序子列的长度 |156|234|:3  
            Merge(A, tmpA, i, i+length, i+length*2-1);
         
        //循环中把要归并的最后一组(length*2 or length)单独提出来,因为该组可能没有满
        if(i+length<n)   //还剩两个子列
            Merge(A, tmpA, i, i+length, n-1);
        else {           //还剩1个子列
            for(int j=i; j<n; j++) 
		    tmpA[j]=A[j];
        }
    }
     
    int* mergeSort(int* A, int n) {
        int *tmpA = new int[n];
        int length=1;
        while(length<n){  //length为有序子列的长度 <n 才对其操作
            divide(A,tmpA,n,length);
            length*=2;
            divide(tmpA,A,n,length);
            length*=2;
        }
        delete tmpA;
        return A;
    }
};

 

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

python代码实现归并排序(Merge Sort )

排序之外部排序

Python代码实现归并排序

Python代码实现归并排序

算法排序02——归并排序介绍及其在分治算法思想上与快排的区别(含归并代码)

排序算法之归并排序