归并排序是一种十分实用的排序方式,因为它很好的诠释了分治的思想,而且往往在归并排序的过程中可以做一些其他的操作,实现一些十分精妙的算法
归并排序的思想就是每一次将序列分成两部分,递归的解决问题,递归回溯时这两部分内容分别是有序的,然后同过他们o(n)地构建新的有序序列,因为每次分成两部分,所以是进行log次,所以总复杂度nlogn
-------------------------归并算法的代码实现---------------------------------------------------------------
int a[2][MAX];
void mergeSort ( int left , int right , int flag = 0 )
{
if ( left == right ) return;
int mid = left + right >> 1;
mergeSort ( left , mid , flag^1 );
mergeSort ( mid+1 , right , flag^1 );
int p = left , p1 = left , p2 = mid+1;
while ( p <= right )
{
if ( p1 == mid+1 || ( a[flag^1][p2] < a[flag^1][p1]&& p2 <= right ) )
a[flag][p++] = a[flag^1][p2++];
else a[flag][p++] = a[flag^1][p1++];
}
}
这副代码要在开始的时候对数组的两维附上同样的值;
下面是讲解:就是一直均分序列,直到序列长度为一时,向上回溯,每次利用两个指针,因为两个序列是有序的,所以只比较指针指向的队首,就可以o(n)的将当前队列变成有序的,然后回溯到原始序列即可,我使用的是滚动数组,能有效的简短代码长度,并且节约空间