如何使用合并排序对外部排序中的运行进行排序

时间:2012-06-12 12:35:05

标签: c database mergesort external-sorting

我正在尝试使用合并排序为大学作业实现(在C中)数据库的外部排序算法。可用内存为buffSize块。我发现此链接非常有用:

http://web.eecs.utk.edu/~huangj/CS302S04/notes/external-sorting2.html

但我的问题是关于伪代码的这一行,在算法的第一阶段:

sort array a using an in-memory algorithm like quicksort

如果我没有权利使用除buffSize空间以外的任何内存,那么我无法分配链接的a数组,如何对包含在其中的记录进行排序这些块(然后将它们存储在临时运行文件中),使用内存中的排序过程(例如快速排序)。在这种情况下我的记录不会在连续的数组中,而是在非连续的内存中找到块,我不能直接应用qsort。任何提示?

1 个答案:

答案 0 :(得分:2)

外部排序的一般方法是:

  1. 读取适合数组内存的数据。
  2. 排序。
  3. 将其写入临时文件(跟踪名称和大小以及最大记录等)。
  4. 返回步骤1,直至到达数据末尾。
  5. 为所写的文件设置合并树,以便进行最少的合并。
  6. 从每个第一个(仅?)合并阶段输入文件中读取一行。
  7. 将最小的(升序排序)写入下一个临时文件(或最终文件)。
  8. 获取新记录以替换刚刚写好的记录。
  9. 返回第7步,直到没有更多数据可供阅读。
  10. 返回步骤6继续合并,直至完成。
  11. 你没有详细说明buffSize内存块意味着什么,但是有一个数组a可以在内存中排序。因此,您将数据读入数组。您使用quicksort对数组进行排序。然后将数组写入磁盘。重复阅读,排序,写入,直到没有更多的输入数据。然后进行合并......