法一
思路如下:
从10亿个数据(int型占据4B)中找中位数,内存限制为1GB。
不可能一次性把数据全部加载到内存中,再使用快速排序算法,因为10亿*4B大约为4GB,内存不够。
可以一次性读入1GB的数据(分10次读取),然后对读入的1GB数据按照最高位即第32位的值进行分类并写入文件,如果最高位是1,写入file1,否则写入file2。那么file1全是负数,file2全是正数,如果file1中有4亿个数字,file2中有6亿个数字,那么中位数就是file2中排序之后从小到大的第1亿个数。
然后再把file2中的数据每次读入1GB进入内存,然后对读入的数据按照次高位即第31位的值进行分类写入文件,如果最高位是1,写入file3,否则写入file4,那么file3中的数据都比file4中的数据大,如果file3中有3亿个数字,file4中也有3亿个数字,那么中位数就是file4中从小到大排序后的第1亿个数字。
然后再把file4中的数据每次都读入1GB进入内存,然后对读入的数据按照次次高位即第30位的值进行分类写入文件。。。
如此下去,直至判断中位数为某一个文件中,且该文件中数据个数在2.5亿个(或者更少)时即可用快速排序找出它。