原地归并算法
归并排序算法(mergesort)是将一个序列划分为同样大小的两个子序列,然后对两个子序列分别进行排序,最后进行合并操作,将两个子序列合成有序的序列.在合成的过程中,一般的实现都需要开辟一块与原序列大小相同的空间,以进行合并操作。这儿有比较全的排序算法: http://www.cnblogs.com/xkfz007/archive/2012/07/01/2572017.html 之前使用过的归并排序,都是需要重新开辟新空间的。一般需要开辟的空间为n(数组大小),所以空间复杂度是O(n). 其实可以对于归并可以不需要开辟新的空间就可以直接进行归并的方法,即原地归并。 其主要思想就是,因为需要归并的部分是有序的,所以需要找到两个序列中第二个序列小于第一个序列的部分,比如对序列[<1, 3, 5, 7>, <2, 4, 6, 8>]进行归并操作。2就是第二个序列中小于第一个序列中的<3,5,7>部分,需要调节<3,5,7>,与2的位置。然后不断的进行扫描。其中进行调整的时候,用到的是对序列的循环移动,循环左移或循环右移。这样就不需要新的空间了。 C++代码如下: void rotate_right(int *v,int sz,int n){ reverse(v,v+sz); reverse(v,v+n); reverse(v+n,v+sz); } void merge(int *v