编程珠玑第一章,电话号码排序,问题是这样的,给你大约1000万个数字,让你用最快的方式进行排序,限制如下:
1. 内存大约1M
2. 数字都是整数,且不重复
3. 数字的范围最大是7位数。
文章提到了大约三种解法,
第一种是归并算法,只不过不在内存,在外存上做归并排序。大致思路是将原始文件读入,然后按照数字的大小划分10份,写到10个文件里。
这样每个文件就小于1M,然后对每个文件进行排序,排序之后,将文件合并。由于file1<file2<...<file10。所以合并很简单,直接依次读一遍,再写文件即可。
读次数:1+10+10
写次数: 10+10+1
第二种二种比较傻,分多次读,每次只读i~ j的数字,然后对其排序,并输入到文件。这个方法不再赘述。
第三种就是使用bitmap,思路就是把一个32位的整数用来存32个数字,比如,如果数字i出现了,则该数的二进制的第i位为1,否则为0。这样1000万个数字大约要1.25M.
首先读入所有的数字,存入bitmap,然后遍历bitmap,如果第i位为1,表示出现过,则输出到文件,否则,不输出。
首先贴上自己的代码,写的不是很简洁,代码能力有待提高:
#include <iostream>
#inc