几种常用的高效排序(三)---归并排序

来源:互联网 发布:影视特技软件 编辑:程序博客网 时间:2024/04/29 02:27

归并排序是一种十分实用的排序方式,因为它很好的诠释了分治的思想,而且往往在归并排序的过程中可以做一些其他的操作,实现一些十分精妙的算法

归并排序的思想就是每一次将序列分成两部分,递归的解决问题,递归回溯时这两部分内容分别是有序的,然后同过他们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)的将当前队列变成有序的,然后回溯到原始序列即可,我使用的是滚动数组,能有效的简短代码长度,并且节约空间


0 0
原创粉丝点击