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

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

归并排序的思想就是每一次将序列分成两部分,递归的解决问题,递归回溯时这两部分内容分别是有序的,然后同过他们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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值