外部排序

Posted wuyepeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外部排序相关的知识,希望对你有一定的参考价值。

外排序问题的出现,主要是因为内存不够。当需要排序的数据量过多,以至于无法一次性把所有的数据都放入内存,这导致了外排序问题的出现。解决大数据量排序的方法是:先分块排序,后进行块合并。

外排序步骤

 

  1. 把原数据分成几段读入内存,以至于每一块都可以完整的在内存中进行排序,排序好后,写入外部存储设备。
  2. 归并已排序好的数据块。
这就是归并排序在外排序中的应用。
    对每块数据进行排序,可以使用各种内排序方法:快速排序、归并排序、堆排序等。这个比较简单,下面模拟一个对排序好的数据块进行归并的过程。
#include<iostream>
#include<iomanip>
#include<assert.h>
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路归并的外排序模拟。对于每块数据的排序过程已经省略掉了,故每块数据初始时都是有序的,我们关注的是归并的过程。在每块数据的最后加一个最大值,作为块结束的标记。 

实验结果截图如下:

 技术分享图片

 

以上是关于外部排序的主要内容,如果未能解决你的问题,请参考以下文章

html 将以编程方式附加外部脚本文件的javascript代码片段,并按顺序排列。用于响应式网站,其中ma

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

android:当用户触摸片段外部时,我如何关闭片段?

从外部片段内的 FragmentTabHost 的子片段添加新的选项菜单

[ jquery 文档处理 insertBefore(content) before(content|fn) ] 此方法用于把所有匹配的元素插入到另一个指定的元素元素集合的前面,实现外部插入(代码片段