雪压枝头低,虽低不着泥
今天准备放假,无聊看到一个场景题,问题如下:
有一个文件里面存储着很多很多很多的无序的数,然后要求进行一个排序,内存限定,磁盘足够
然后捣鼓了一下,学到了一种新技能 - 多路归并排序
学习的过程是这样的:
第一步 : 把存储着很多很多很多数的文件进行切割,切割成N个小文件,每个小文件都存储一些无序的数,具体切割的每个文件的大小不要超过机器的内存,如下图:
第二步: 文件切割后标记每个文件唯一的标识,暂且标识为 文件1、文件2 .... 文件n; 然后对每个文件里面的数据进行内存排序,并把文件里最小的数记录到内存中,如下图;
第三步:磁盘创建一个新的文件,对内存里面的数字进行排序,将最小的数字追加到文件中,并记录最小的数字对应的文件,如这一轮中最小的数字是7,将7追加新文件,然后再从7对应的有序的文件n中取下一个数到内存结构的排序数组中,然后又再将最小的数字追加到新文件中.... 如此的反复,这样就可以保证内存只有一个数组在排序,相当于一个中转站,从磁盘取数排序,然后再将数追加到磁盘中
最后,附上一个整体的数据流向图