堆排序和归并排序

数据结构面试问题总结 —— 排序

问题:现在有一个1T的文件,文件中每一行存放一个数字,数字不重复也不一定连续,现在你有一台内存大小为512M的电脑,不考虑其他因素,把这个文件中的数字排序。

我的想法是分段排序,每次读取512M的数据进入内存排序,将每一段存放再一个新的文件中,但是有一个严重的问题:由于数字不一定连续,接下来每一段怎么排序就没办法了。

对于这个问题,首先肯定是要分段的,但是怎么分才能保证A段中的数字都小于B段中等数字呢?

如果能想到这一点其实就可以联想到带有归类性的排序算法:

桶排序

工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。
例如:8 5 22 15 28 9 45 42 39 19 27 47 12排序过程
在这里插入图片描述
这样首先各个元素就可以直接通过整除的方法放至对应桶中。而右侧所有桶内数据都比左侧的要大。
在刚刚放入桶中的时候,各个桶的大小相对可以确定,右侧都比左侧大,但桶内还是无序的,对各个桶内分别进行排序,再依次按照桶的顺序、桶内序列顺序得到一个最终排序的序列。
在这里插入图片描述
详细算法引自:bigsai的文章

利用桶排序的分区字段的特点,将这个问题中的数据分别写入到多个桶文件中,再针对每个桶文件使用内存排序算法(如快速排序),将文件内容进行排序输出到有序桶文件中。最后将这些文件按分桶的顺序组合组合起来,形成最终有序的文件。【需要注意的是桶内的数据大小不能超过521M】。

归并排序

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
在这里插入图片描述
详细算法引自:xin_xin666的文章 或者 BUPT-WT的文章

对于这道题,用下面的方法:

  1. 利用分治的思想,减小数据的体积,将1TB的文件按固定大小进行切分,比如大小为 512 M,读取时可按行读取,限制大小在 512 M以内,这样可以切出 N 个文件。
  2. 将这 N 个文件,使用快速排序算法对这每个文件进行排序操作,可得到 N 个排序的文件
  3. 将这 N 个文件进行合并输出,合并的逻辑就是从每个文件中依次获取数据,排序,输出,就像示例中的那样。就可以得到一个最终有序的文件。

总结

这两种方法都是用空间换时间的排序,桶排序的特点是把数据按照计划的区间分段,归并排序的特点是分治然后汇总。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值