归并排序的几种变形

归并排序的基础概念就不讲了,我的博客只会写有创造性的东西。 归并排序的代码如下:void mergesort(int* arr,int n){if(n>1){mergesort(arr,n/2);mergesort(arr+n/2,n-n/2);merge(buff,arr,n/2,arr+n/2,n-n/2); memcpy(arr,buff,n);}}
摘要由CSDN通过智能技术生成

归并排序的基础概念就不讲了,我的博客只会写有创造性的东西。

 

归并排序的代码如下:

void mergesort(int* arr,int n){

if(n>1){

mergesort(arr,n/2);

mergesort(arr+n/2,n-n/2);

merge(buff,arr,n/2,arr+n/2,n-n/2);

memcpy(arr,buff,n);

}

}

 

迭代版

标准的归并排序是个递归过程,不过要用迭代过程表达也很简单,就是先两个两个一排,再四个四个一排。。。。

如:

98 15 73 20 76 27 34 82

15 98 20 73 27 76 34 82 //第一趟

15 20 73 98 27 34 76 82 //第二趟

15  20 27 34 73 76 82 98 //第三趟

 

代码不写了,代码比递归版的复杂一点,效率也提高了一点

 

原地归并算法

标准归并排序使用的归并算法要额外申请一个大小为n的数组暂时存放归并数据,原地归并算法就不用,不过要以时间为代价,它的一次归并过程的时间复杂度是O(n^2)

 

举个例子:

15 20 76 98 27 34 73 82

这里有两段有序数组,检测到应该把273473插入到2076之间,也就是把

76 98 27 34 73 这段数组循环左移两位。

如何把数组循环左移k位呢?

用的是翻大饼算法,先把前k个元素翻转过来,再把后n-k个元素翻转过来,在翻转这n个元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值