归并排序的改进——空间折半

        这是我的毕业论文,也是我大学十年唯一值得骄傲的一件事,也许以后不会走上编程这一条路了,但是我认为这个算法还是有一定的可取之处的,在CSDN上发布给大家观看,希望你们能有所收获。

       文章并不难,核心思想就是将归并排序所用到的额外空间减少为原来的一半进行归并排序,我之前没有在网上找到过,所以在这里给大家分享,为我的学生生涯画上一个句号。

一、算法思想

       常规的归并排序因为合并的时候不能在原数组上进行,所以需要一个大小与两个待合并数组长度之和相等的额外数组来辅助排序,所以排序中就有了一个n大小的额外空间。本节的优化方案就是减少一半额外空间,也减少一半的复制过程来完成排序。 

       优化后的归并排序和原来的原理基本上是一样的。只有在合并操作哪里建立的辅助空间的大小d=mid-l+1,也就是大小等于前一个有序序列的大小,然后把前一个有序序列的值复制到新的数组aux上。赋值完成后比较新数组与后一个有序序列的值,将小的值赋值到a[k]上,起始的k=l,每当赋值完一次,k就加一,直到k>r就完成合并。

二、算法图解

为了方便理解,先以一组待排序数列“5 4 7 9 3 8 2 1”进行图解,了解归并排序减少一半的额外空间后是怎么进行两个有序序列的合并的:

起始操作与归并排序的一样,分割待排序数列:

 

55

 

44

 

77

 

99

 

33

 

88

 

22

 

11

 

 

同之前的归并排序一样,这里只介绍最后一个合并操作。在最后一个操作里,两个有序序列分别是“4 5 7 9”和“1 2 3 8”。初始数据aux[4]={4,5,7,9}。k=l,j=mid+1,i=0。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值