排序

将文件中的各个记录按关键字值(见数据查找)的递升或递降次序重新排列成为一个新的记录序列,这是数据处理的一项基本功能。经过排序的文件便于分类比较或进一步处理。例如,对于一个未经排序的文件,在查毕整个文件之前不能判定某个给定的关键字值确实不在该文件中。组织排序之后,则无需查毕整个文件就能作出这一判断。排序是数据处理,特别是批处理任务中最常用的操作之一。对计算机内存储器中的记录进行排序称为内排序。对存储在外部设备中的文件记录排序称为外排序,外排序需要以内存储器作为过渡介质来进行。

内排序

常用的内排序有三种算法。

(1)线性查找排序算法 以线性查找法为基础的排序算法。在内存储器中确定一个与被排序文件同样大小的区域作为新区,用线性查找法在原文件中找出具有最小(或最大)关键字值的记录,放入新区第一记录位置,再从原文件中找出第二个最小(或最大)关键字值的记录,放入新区第二个记录位置。重复上述过程,直至原文件中所有记录都已放入新区为止。这种算法简单,但效率很低,只适于对少量记录的排序。

(2)互换排序算法 对原文件中不合指定顺序的两相邻记录互换位置。有三种互换算法。a.线性查找互换算法:将第一记录逐一与其后面的记录比较,并与较小关键字值的记录互换,结果使最小关键字值的记录处于第一记录位置。然后从第二记录开始,重复上述过程,使第二小关键字值记录处于第二记录位置。如此继续,直到关键字值最大的记录处于最后记录位置为止。b.相邻比较互换算法:将相邻记录比较,并按指定次序互换其位置。第一个记录和第二个记录比较,第二个和第三个比较,直到倒数第二个和最后一个比较。从头到尾算完一遍,然后进行第二遍,直至某一遍没有一个比较需要互换位置时为止。c.起泡互换排序算法:首先将第二个记录与第一个记录比较,必要时互换。然后将第三个记录与第二个记录比较,必要时互换。若互换,则新的第二个记录与第一个记录比较,必要时互换。第三个记录再与第二个记录比较,重复上述过程。使一个记录如同起泡一样,上升到适当的位置,在它上面再没有关键字值比它大(或小)的记录。直到最后一个记录经过比较而不再上升为止。

(3)合并排序算法 先将文件中的各个记录分为合乎次序的若干组,然后分别两组两组地合并,使组数减少一半;再如此继续合并,直到全部合为一组为止。

外排序

外排序包括两个步骤。

(1)把要排序的文件中的一组记录读入内存储器的排序区,对读入的记录按上面讲到的内排序法进行排序,排序之后输出到外存储器。重复这一过程,每次一组,直到原文件所有记录被处理完毕。

(2)将上一步分组排好序的记录两组两组地合并排序。在内存容量允许的条件下,每组中包含的记录越大越好,这样可减少合并的次数。

参考文章