外部排序 多路合併

2021-07-13 22:16:51 字數 2336 閱讀 5525

《資料結構與演算法分析——c語言描述》  第七章

這個還是挺有意思的,用很少的記憶體空間給很多的數排序,複雜度是logk(n/m)

#include #include #include#include//#include"fatal.h"

#define m 3

#define k 3

typedef int elementtype;

void insertionsort(int *a, int n)

}void swap_my(elementtype *a, elementtype *b)

elementtype median3(elementtype a, int left, int right)

#define cutoff (3)

void qsort_my(elementtype a, int left, int right)

while (a[--j] > pivot) {}

if (i < j)

swap_my(&a[i], &a[j]);

else

break;

} swap_my(&a[i], &a[right - 1]);

qsort_my(a, left, i - 1);

qsort_my(a, i + 1, right);

} else

insertionsort(a + left, right - left + 1);

}void quicksort_my(elementtype a, int n)

file* file[2 * k];//檔案指標陣列

char name[200];//生成的名字

int runlen;//順序串長度

void write(int *a, int n, file *out)

}char* filename(char *buf, int part, int i)

void open(int part, char* type)

} else }}

void close(int part)

int isallend(int readpart)

int isallbiggerthanrunlen(int * cursor)

return 1;

}typedef std::pairpair_int;

auto cmp = (const pair_int& left, const pair_int& right) ;//lambda表示式,算是一種比較精簡的函式吧

int randint(int i, int j)

void getrandomint(int *a, int n)

for (int i = 1; i < n; i++)

}#define n 222

void writerandinttofile()

int main()

quicksort_my(max_memory, readnum);

//交替寫到tb1或寫到tb2……

write(max_memory, readnum, file[k + writenum]);

writenum = (writenum + 1) % k;

} fclose(ta1);

close(1);

//k路排序

runlen = m;

int readpart = 1;//0表示ta1,ta2,1表示tb1,tb2

while (runlen < n)

else

writenum = 0;//寫到哪,一半中的 第乙個磁碟還是第二個磁碟

while (!isallend(readpart)) );

isinsertnew = 1;}}

}if (isinsertnew == 0 && h.empty())//這裡可是細節,這個最後只剩下空格沒有數字的話也不算檔案結尾,feof返回0

break;

pair_int p = h.top();

h.pop();

fprintf(file[writepart*k + writenum], "%d ", p.first);

cursor[p.second]++;

ishasnumnowrite[p.second] = 0;

}writenum = (writenum + 1) % k;

} close(0);

close(1);

runlen *= k;

readpart = (readpart == 0) ? 1 : 0;

}}

關於多路歸併排序 外部排序

比如檔案內有1億資料排序。程式設計珠璣第乙個case是有關乙個技巧性解決外部排序問題的。問題很巧妙的解決了,但一開始提到的利用歸併排序進行外部排序的演算法仍值得仔細 一下,畢竟本科時學的不是很深入。先來看內部排序中最簡單的2路歸併排序演算法。演算法核心操作是將一維陣列中前後相鄰的兩個有序序列歸併為乙...

敗者樹與外部多路歸併排序

在處理大資料量的排序時,由於資料無法全部載入到記憶體,內部排序無法對整個資料集進行排序,需要到外部排序。外部排序有一些特點,跟記憶體容量和讀寫檔案有關 1.讀寫檔案,需要考慮 io 時間 2.從無序到逐步有序的過程中,需要多個中間檔案外部排序有多種,常見的歸併排序的如下 輸入為大檔案 f 排序過程分...

多路歸併排序

我們有如下乙個問題 對於若干個長度相同的序列,將其合併成乙個有序的序列。暴力的方法顯然是不可取的,這裡可以利用優先佇列來處理這個問題。首先從簡單的開始,對於2路歸併排序,設兩個序列為,將,排序,有 a1 a2 a3 an b1 b2 b3 bn 建立乙個優先佇列,佇列中首先存入元素 a1,0 b1,...