归并排序的优化方法

归并排序

应用分治法的典型

  • 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
posted @ 2018-03-24 09:28  小螺号打豆豆  阅读(172)  评论(0编辑  收藏  举报