这是我的毕业论文,也是我大学十年唯一值得骄傲的一件事,也许以后不会走上编程这一条路了,但是我认为这个算法还是有一定的可取之处的,在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。