码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2016-05-16 20:03:43      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

对于一个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;
    }
};

 

归并排序

标签:

原文地址:http://www.cnblogs.com/claremore/p/5499039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!