• 归并排序的优化方法


    归并排序

    应用分治法的典型

    • O(nlogn)时间复杂度排序.

    • 每次将序列分成两部分,对两部分 分别递归排序

    • 将得到的结果合并,得到结果

    • 归并排序主要内容在分和合并,合并后就已经是有序序列,所以不用治

    • 合并: 最简单的想法是原序列的一个copy , 排序后赋值给元序列,这会付出额外的空间开销,而且重复赋值也会有开销

    • 优化的方法:

      • 设置一个索引数组b[i],记录原数组第i位排序后应该放到第几位,排序依据索引数组,只改变索引数组,避免了重复赋值的开销

        • 得到每个元素应该放的位置后将各个元素放到对应的位置,不适用额外的数组实现这一点需要一点技巧.
      • 减小递归的层数

        • 自底向上合并
        • 在规模比较小的情况下,使用冒泡排序替换递归求解
        • 对原数组进行一次遍历,得到已经是升序的区间,对这些区间进行合并

    减少重复赋值的优化

    
    #include 
    using namespace std;
    const int maxn = 1005;
    int a[maxn] ,n ,b[maxn];
    
    void init()
    {
        n = 10;
        for(int i=0;i=r)return;
        int mid = (l+r)/2;
        merge_sort(l,mid);
        merge_sort(mid+1,r);
        mer(l,mid,r);
    }
    
    int main()
    {
        init();
        for(int i=0;i
    落霞与孤鹜齐飞,秋水共长天一色
  • 相关阅读:
    1856: [Scoi2010]字符串(Catalan数)
    11.6NOIP模拟赛
    bzoj1257[CQOI2007]余数之和(除法分块)
    11.5NOIP模拟赛
    bzoj1048(记忆化搜索)
    置顶公告+更新日志
    CF585F Digits of Number Pi
    [SHOI2007]善意的投票
    [HEOI2015]最短不公共子串
    树形背包复杂度+P3177 [HAOI2015]树上染色
  • 原文地址:https://www.cnblogs.com/star-and-me/p/8636874.html
Copyright © 2020-2023  润新知