归并排序
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; } };
以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章