20180322归并排序

前置知识

  • merging sort,意思是将两个序列合并在一起,并且使之有序。
  • 分治法的一个典型应用:
    • 先保证小范围的数据有序
    • 再使大范围的序列有序

本期内容

名词解释

  • 归并排序需要一个原始序列大小的辅助空间。

实现

  • 时间复杂度O(nlog^2n)
  • 空间复杂度O(n)
  • 稳定的算法
    • 数据需要两两比较,不存在跳跃交换,所以是稳定的。
// 归并两个序列的算法
void Merge(int arr[],int tmp[], int start, int mid, int end)
{
    int i=start, j=mid+1,k=start;
    // 比较排序并将值赋给中间变量tmp
    while(i != mid+1 && j!= end+1)
    {
        if(arr[i]>=arr[j])
            tmp[k++] = arr[j++];
        else
            tmp[k++] = arr[i++];
    }
    // 若一个序列指针走到最后,另一个指针也走到最后,直接复制
    while(i!=mid+1)
        tmp[k++] = arr[i++];
    while(j!=end+1)
        tmp[k++] = arr[j++];
    // 将中间变量数组中存储的值赋给原始数组
    for(i=start;i<=end;i++)
        arr[i]=tmp[i];
}
void MergeSort(int arr[], int tmp[], int start, int end)
{
    int mid;
    if(start < end)
    {
        // 取中间值将原序列分为两组
        mid = (start + end)/2;
        MergeSort(arr,tmp,start,mid);
        MergeSort(arr,tmp,mid+1,end);
        Merge(arr,tmp,mid,end);
    }
}

总体评价

代码学习

履历

  • 20180322整理,需要再主题阅读一下
    • 先暂时记录下,算法思想也是理解了,代码要再看看。

转载于:https://my.oschina.net/wolflion/blog/1649209

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值