外存快速排序是指外存多路快速排序,与内存快速排序思想一样,找一个分点把数据分成两半,小元素在分点前,大元素在分点后,分别快排递归。
对于外排序算法,数组不是划分成两半,而是根据外存算法的特点划分成多个部分。其思想是,对未排序的列表使用小于M/B个分割元素,通过扫描一次I/O实现划分,然后对划分的每一块进行递归划分,直到最后的划分能存进内存为止。
外存多路快速排序算法描述
选择出k个分割点;
将数组A的所有元素按照分割点进行分组;
将分组完的块输出到对应外存中;
for A的每一个分组A, do
if 第i个分组中的磁盘快数大于内存可以容纳的快数 then
Multi_sort(A, i);
else
将第i个分组放入内存进行内存排序;
end if;
外存多路快速排序算法I/O复杂度分析
外存快速排序的I/O复杂度是O(N/B * logM/BN/B)
(1).每一轮的I/O复杂度。包括
-
输入一个缓冲区
-
输入缓冲区中读入一个磁盘块
-
磁盘块相应数字写入内存中对应缓冲区
-
缓冲区满时,数字输出到外存
-
每个数据块一进一出,I/O次数是O(N/B)
(2).一共有多少轮?(假设每轮划分是均匀,N不断被分成M/B-1组)
在第一轮中,输入分成了M/B - 1组(留一个磁盘块作为输入缓冲),每组M/B-1个元素。
第二轮划分,每组元素有N/(M/B-1)^2个,如果每组都放不进内存;则进行下一次划分
...... .......
直到第k轮,每组元素有N/(M/B-1)^k个,可以放入内存,则N/(M/B-1)^k == M.
由此得到,k = logM/B-1N/M = O(logM/BN/M)。
经上述分析,每轮排序的I/O复杂度是O(N/B),一共O(logM/BN/M)轮,外存排序的I/O复杂度是O(N/B * logM/BN/M)或O(N/B * logM/BN/B)。