归并排序
应用分治法的典型
-
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