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

    实验结果截图如下:

     

  • 相关阅读:
    加入创业公司有什么利弊
    Find Minimum in Rotated Sorted Array II
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Find Minimum in Rotated Sorted Array
    Remove Duplicates from Sorted Array
    Spiral Matrix
    Spiral Matrix II
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/wuyepeng/p/9750079.html
Copyright © 2011-2022 走看看