zoukankan      html  css  js  c++  java
  • 外部排序

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

    外排序步骤

    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路归并的外排序模拟。对于每块数据的排序过程已经省略掉了,故每块数据初始时都是有序的,我们关注的是归并的过程。在每块数据的最后加一个最大值,作为块结束的标记。 

    实验结果截图如下:

     

  • 相关阅读:
    HDU
    HDU
    HDU
    HDU
    POJ
    POJ
    POJ
    hdu-4745 Two Rabbits
    蓝桥杯历年试题 小朋友排队
    蓝桥杯历年试题 矩阵翻硬币
  • 原文地址:https://www.cnblogs.com/wuyepeng/p/9750079.html
Copyright © 2011-2022 走看看