问题描述:

所有 7 位数的正整数,大约有 10000000 个,不会重复,内存可用空间只有 1MB ,进行排序。

解决方案:

归并排序

读取一遍文件,然后进行多次归并排序。

多趟排序

如果每个号码都用 7 个字节来存储,1 MB 的空间最多存储 143000 个号码,但是假如每个号码用 32 位整数来表示的话(因为是 7 位正整数),1 MB 的空间可以存储 250000 个号码,这样进行多次读取,第一次读取0 ~ 249999 之间的整数并进行排序,以此类推,读取 40 遍文件,可以完成排序。

神奇排序

上面两个方法,一个进行了多次排序,一个进行了多次读取文件,都有弊端。
因为排序需求的独特性,可以初始化一个长为 10000000 位的字符串,遍历源文件,假如遍历到整数 n ,就在字符串的第 n 位 置 1。
假如待排序文件前 9 位分别是 :1 5 8 2 7 6 9 3 10,数组遍历完成后字符串为 0 1 1 1 0 1 1 1 1 1,可以看到,排序文件中没有的 4 和 0,在字符串中表现为,第 0 位 和 第 4 位 分别为 0,其他包含的数字置为了 1。
这个算法只读取了一次文件,并且有相当的执行效率。