|
http://blog.csdn.net/ltyqljhwcm/article/details/52155097?locationNum=6&fps=1这篇文章对手摇算法以及归并排序有很详细的讲解!!
手摇算法就是空间复杂度为O(1),仅仅是依靠交换操作来对字符串进行处理。
利用手摇算法实现归并排序,主要需要三个变量:
i指向右边待排序列将要插入的左边序列的位置;
index指向右边待排序列的初始位置;
j指向右边待排序列的末尾位置的后一个位置;
也就是将右边index-----j-1之间的序列插入到左边i的前面的位置;也就是将index-------j-1和i-------index-1这两个数据块交换位置;
class MergeSort { public: int* mergeSort(int* A, int n) { // write code here mergeSort(A,0,n-1); return A; } void mergeSort(int* A,int start,int end){ if(start>=end) return; int middle=(start+end)/2; mergeSort(A,start,middle); mergeSort(A,middle+1,end); merging(A,start,middle,end); } void merging(int* A,int start, int middle, int end){ int i=start; int index=middle+1; int j=middle+1; while(j<=end&&i<j){ while(A[i]<=A[j]&&i<j){ i=i+1; } if(i>=j) break;//说明此时已经排序结束 while(A[j]<A[i]&&j<=end){ j=j+1; } reverse(A,index,j-1); reverse(A,i,index-1); reverse(A,i,j-1); i=i+(j-index); index=j; } } void reverse(int* A,int left,int right){ if(left==right) return; while(left<=right){ int temp; int* p; int* q; p=&A[left]; q=&A[right]; temp=*p; *p=*q; *q=temp; left=left+1; right=right-1; } } };
对于上面的归并排序来说,空间复杂度为o(1),而时间复杂度为O(n*logn)--O(n*n*logn)。 |