你现在有一个文件,文件中顺序存有N个记录,R1,R2,...,RN,这些记录不是有序的,但是你知道一个整数M,这些记录满足R1以及RM+1。 1,设计一个算法或编写一个程序,将文件中的记录排序为R1',R2',...,RN',算法或程序读取文件的次数为O(N),不限内存使用, 2,设计一个算法或编写一个程序,将文件中的记录排序为R1',R2',...,RN',算法或程序读写文件的次数为O(N),空间复杂度为O(1),亦即,你使用的内存大小和M,N均无关。
第一个要求是读取文件次数为O(N),但是不限制内存的使用;第二个要求是读取文件次数为O(N),但是空间复杂度为O(1)。区别在于限不限制内存的使用。
如果不限制内存的使用,我们可以将文件中的内容全部读取到内存中,保存为数组,然后再对数组进行排序;如果限制内存的使用,我们可以采用外排序来解决这个问题,外排序一般会借助于文本文件。
第一种方法:
将原文件中的记录顺序读取到内存中,以数组保存,然后以M为分隔将
数组看为两组,互相比较两组元素之后输出,最后输出剩下的元素。
性能分析:
1. 时间复杂度是O(N),因为读取原文件N次,比较小于4N次,输出N次,
加在一起的数量级是N的一次方
2. 空间复杂度是N,因为将原文件中的记录事先读取到内存中,以数组
保存,这个辅助空间的长度是N
第二种方法:
将原文件中的记录以M分隔,读取后保存到两个临时文件file_temp1.
txt
和file_temp2.
txt
中,然后将这两个临时文件中保存的数组看为两组,
分别从这两个临时文件中读取元素,比较后输出,最后读取并输出剩下
的元素。
1. 时间复杂度是O(N),因为读取原文件N次,写临时文件N次,读取临时
文件N次,比较小于6N次,输出N次,加在一起是N的一次方
2. 空间复杂度是1(与M,N均无关系)