标签:
对于一个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