数据结构:外排序-多路归并
来源:互联网 发布:excel 条形图 数据截断 编辑:程序博客网 时间:2024/04/29 04:54
外排序
外排序问题的出现,主要是因为内存不够。当需要排序的数据量过多,以至于无法一次性把所有的数据都放入内存,这导致了外排序问题的出现。解决大数据量排序的方法是:先分块排序,后进行块合并。
外排序步骤
- 把原数据分成几段读入内存,以至于每一块都可以完整的在内存中进行排序,排序好后,写入外部存储设备。
- 归并已排序好的数据块。
这就是归并排序在外排序中的应用。
对每块数据进行排序,可以使用各种内排序方法:快速排序、归并排序、堆排序等。这个比较简单,下面模拟一个对排序好的数据块进行归并的过程。
#include<iostream>#include<iomanip>using namespace std;const int MAX = 100;int key[5][5] = {{ 3, 5, 7, MAX },{ 1, 6, 9, MAX },{ 2, 4, 8, MAX },{ 0, 12, 14, MAX },{ 10, 11, 13, 15, MAX }};void sort(){//使用pos记录每行正在参与排序的元素下标int pos[5];//初始化memset(pos, 0, 5*sizeof(int));int i, min, data;while (true){//找出第一个排序未完成的队列i = 0;while (i < 5 && key[i][pos[i]] == MAX)i++;if (i == 5) //排序完成break;min = i;data = key[min][pos[min]];i++;//找出当前参与排序的所有数中最小的while (i < 5){if (key[i][pos[i]] < data){min = i;data = key[min][pos[min]];}i++;}//打印当前最小者cout << setw(4) << key[min][pos[min]];pos[min]++;}cout << endl;}int main(){cout << "------多路归并的模拟---by David---" << endl;cout << "原序列是" << endl;int i, j;for (i = 0; i < 5; i++){for (j = 0; j < 5 && key[i][j] != MAX; j++)cout << setw(4) << key[i][j];cout << endl;}cout << "经过5路归并排序" << endl;sort();system("pause");return 0;}
这是一个常见的5路归并的外排序模拟。对于每块数据的排序过程已经省略掉了,故每块数据初始时都是有序的,我们关注的是归并的过程。在每块数据的最后加一个最大值,作为块结束的标记。
完整代码下载:外排序
专栏目录
- 数据结构与算法
- C指针
1 0
- 数据结构:外排序-多路归并
- 多路归并的外排序
- 多路归并的外排序
- 外排序-多路归并
- 多路归并 外排序 大文件排序 海量数据处理
- 外排序之多路归并&&位图法
- 数据结构 之 外排序
- 数据结构--Chapter8(外排序)
- 外排序和归并排序
- 归并排序实现外排序
- 多路归并排序 外排序 大文件排序 java实现
- 多路归并对1000 万无序数排序(外排序)
- 选择置换+最优多路归并+败者树,解决外排序问题
- 如何使K路归并外排序达到最优
- 用归并法做外排序
- 外排之多路归并的败者树
- 外排序(磁盘排序)之多路归并排序的简单实现
- 外排序(磁盘排序)之多路归并排序的简单实现(转)
- 总结自己的Git常用命令
- 《V字仇杀队》短评
- 把音乐加进来-------Day89
- iOS 7最佳实践:一个天气App案例
- 调用约定
- 数据结构:外排序-多路归并
- 拓扑编辑器(一)
- Android ListView详解
- 看到的好句!!
- 递归的工作原理
- 反射02
- 虚拟机上模拟CentOS6.5开机故障与解决方法
- 【LeetCode】Insertion Sort List
- Linux C线程池