本文是針對[資料結構基礎系列(10):外部排序]中的實踐專案。
【專案】敗者樹歸併模擬
編寫程式,模擬改者樹實現5路歸併演算法的過程。
設有5個檔案,其中的記錄的關鍵字如下:
f0: f1: f2:f3: f4:
要求將其歸併為乙個有序段並輸出。
假設這些輸入檔案資料儲存在記憶體中,輸出結果也不必輸出到檔案,而是在螢幕上輸出即可。
參考解答
#include
#define maxsize 20 //每個檔案中最多記錄
#define k 5 //5路平衡歸併
#define maxkey 32767 //最大關鍵字值∞
#define minkey -32768 //最小關鍵字值-∞
typedef
int infotype;
typedef
int keytype;
typedef
struct
//記錄型別
rectype;
typedef
struct
filetype; //檔案型別
typedef
int losertree[k]; //敗者樹是完全二叉樹且不含葉子
rectype b[k]; //b中存放各段中取出的當前記錄
filetype f[k]; //存放檔案記錄的陣列
void initial()
void input(int i,int &key) //從f[i]檔案中讀乙個記錄到b[i]中
void output(int q) //輸出f[q]中的當前記錄
void adjust(losertree ls,int s)
//沿從葉子節點b[s]到根節點ls[0]的路徑調整敗者樹
t=t/2;
}ls[0]=s;
}void display(losertree ls) //輸出敗者樹
void createlosertree(losertree ls) //建立敗者樹
void k_merge(losertree ls) //利用敗者樹ls將進行k路歸併到輸出
}int main()
第16周外部排序之 專案2 敗者樹歸併模擬
編寫程式,模擬改者樹實現5路歸併演算法的過程。設有5個檔案,其中的記錄的關鍵字如下 f0 f1 f2 f3 f4 要求將其歸併為乙個有序段並輸出。假設這些輸入檔案資料儲存在記憶體中,輸出結果也不必輸出到檔案,而是在螢幕上輸出即可。include define maxsize 20 每個檔案中最多記錄...
資料結構 歸併演算法
源 獲取 歸併排序的基本思想,先將序列一分為二,獲得左右兩個序列,再將子串行一分為二,以此類推得到最小的序列,因此歸併排序也需要遞迴思想。分解流程 每次取一半,分為兩個子串行 合併流程 將子串行有序排列後合併起來 合併子串行,就進行排序,此時需要引入乙個臨時陣列 左側陣列的起始指標 int righ...
資料結構 歸併樹 區間第k大
求區間第k大有很多種方法比如可持久化線段樹,分桶法和平方分割 當然,我們還可以用歸併樹 請原諒蒟蒻才曉得歸併樹,寫的不好 我們把數列用線段樹維護起來。線段樹的每個節點都儲存了對應區間排好序後的結果。在這之前我接觸到的線段樹上面儲存的都是數值,而這次有所不同,每個節點儲存的是數列。如圖 畫的醜,勿噴 ...