另一种置换-选择排序的实现方法是利用最小堆。也可以得到平均长度为2p的初始归并段,这里的p是内存工作区可容纳的记录数。方法实现的步骤

(1)建立初始堆. ①从输入文件中输入p个记录,建立大小为p的堆。 ②为第一个初始归并段选择一个适当的磁盘文件作为输出文件。 (2)置换-选择。 内存工作区存在两个堆:当前堆和新堆,新堆紧接在当前堆后存放,总大小为p。 ①输出当前堆的堆顶记录到选定的输出文件。 ②从输入文件中输入下一个记录。若该记录排序码的值不小于刚输出记录排序码的值,则由它取代堆顶记录,并调整当前堆。若该记录排序码的值小于刚输出记录的排序码的值,则由当前堆的堆底记录取代堆顶记录,当前堆的大小减1。新输入的记录存放在当前堆的原堆底记录的位置上,成为新堆的一个记录。 ③如果新堆的记录个数大于「p/2<img src='https://img2.soutiyun.com/ask/2021-02-28/983400054091429.png' />,应着手调整新堆;如果新堆中已有p个记录,表示当前堆已输出完毕,当前的初始归并段结束、应开始创建下一个初始归并段,因此必须另为新堆选择一个磁盘文件作为输出文件。 ④重复步骤②~③,直到输入文件输入完毕。 (3)输出剩余记录。 ①输出当前堆中的剩余记录,并对输出边调整。 ②将内存工作区中的新堆作为最后一个初始归并段输出。 设p=5,排序码序列为(54,15,62,10,77,24,29,20,59,43,69,31,47,38,12,18,51,27),执行置换选择排序的结果如图10-19(a)~图10-19(g)所示. <img src='https://img2.soutiyun.com/ask/2021-02-28/983400079564886.png' /><img src='https://img2.soutiyun.com/ask/2021-02-28/983400088353388.png' /> 生成的3个初始归并段为(10,15,24,29,54,59,62,69,77),(20、31,38,43,47,51),(12,18,27)。编写一个算法,实现上述利用堆的置换-选择排序.

时间:2024-01-31 10:38:44

相似题目