zoukankan      html  css  js  c++  java
  • 归并排序的优化方法

    归并排序

    应用分治法的典型

    • 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
    落霞与孤鹜齐飞,秋水共长天一色
  • 相关阅读:
    Android开发之Sqlite的使用
    ZOJ 3607 Lazier Salesgirl
    ZOJ 3769 Diablo III
    ZOJ 2856 Happy Life
    Ural 1119 Metro
    Ural 1146 Maximum Sum
    HDU 1003 Max Sum
    HDU 1160 FatMouse's Speed
    Ural 1073 Square Country
    Ural 1260 Nudnik Photographer
  • 原文地址:https://www.cnblogs.com/star-and-me/p/8636874.html
Copyright © 2011-2022 走看看