標籤:style blog http os 使用 io for 資料 ar
外排序
外排序問題的出現,主要是因為記憶體不夠。當需要排序的資料量過多,以至於無法一次性把所有的資料都放入記憶體,這導致了外排序問題的出現。解決大資料量排序的方法是:先分塊排序,後進行塊合并。
外排序步驟
- 把原資料分成幾段讀入記憶體,以至於每一塊都可以完整的在記憶體中進行排序,排序好後,寫入外部存放裝置。
- 歸併已排序好的資料區塊。
這就是歸併排序在外排序中的應用。 對每塊資料進行排序,可以使用各種內排序方法:快速排序、歸併排序、堆排序等。這個比較簡單,下面類比一個對排序好的資料區塊進行歸併的過程。
#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路歸併的外排序類比。對於每塊資料的排序過程已經省略掉了,故每塊資料都是有序的,我們關注的是歸併的過程。在每塊資料的最後加一個最大值,作為塊結束的標記。
完整代碼下載:外排序
專欄目錄
資料結構:外排序-多路歸併