一种数据库应用中常用的排序算法--两阶段多路归并排序算法

  在数据库应用中,常常采用“两阶段多路归并排序算法”来解决对海量数据的排序问题(这里的海量数据是指数据大小远远超过了数据库可用的主存的大小,无法将所有数据一次性的载入主存进行排序)。

 

  该算法包括以下两个阶段:

 

  阶段1:将主存大小的数据片段进行排序,使得每条记录都是一个有序表的一部分,该表正好可以装在可用的主存内。这样就产生了任意个这样的排序子表;

  阶段2:归并所有的排序子表以形成单个的排序表。

 

  其中阶段1比较清楚,首先是将原本位于二级存储(磁盘)中的数据,分批载入主存进行排序,再写入到二级存储的新块上,以形成排好序的子表。而在这一阶段的排序中,主要采用快速排序。因为进行归并排序还需要额外的内存作为辅助数组,效率不如快速排序。

  而阶段2的处理方式就稍显复杂,首先将每个排序子表的第一个块读入一个主存缓冲区(这里不讨论由于数据量大,排序子表太多,无法将每个子表的第一个块都能读到主存的情况)。再在主存中建立一个输出缓冲区,缓冲区的安排由下图所示。

 

                         《一种数据库应用中常用的排序算法--两阶段多路归并排序算法》

                                                          图1 多路归并算法的主存布局

 

                                                              

 其主要步骤如下:

(1) 在所有子表载入主存的数据块中的第一个元素中找出最小记录;

(2) 将最小记录移动到输出块的第一个可用位置;

(3) 如果输出块已满,则将其写入磁盘,并重新初始化该缓冲区;

(4) 如果数据块中的元素已经取完,则从相同的子表中读出下一个块到相同的缓冲区,如果没有块剩余,则该缓冲区为空。

 

该算法的优点是磁盘中的数据只被读入主存两次,就完成了海量数据的排序。减少了IO时间。

 

 

 

    原文作者:排序算法
    原文地址: https://blog.csdn.net/huangyu20072010/article/details/6189901
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞