數據結構實踐——敗者樹歸並模擬
阿新 • • 發佈:2017-07-15
數據結構 最小 stdio.h 初始 tdi let ber -s 每一個
本文是針對[數據結構基礎系列(10):外部排序]中的實踐項目。
【項目】敗者樹歸並模擬
編敲代碼,模擬改者樹實現5路歸並算法的過程。
設有5個文件。當中的記錄的關鍵字例如以下:
F0:{17,21,∞} F1:{5,44,∞} F2:{10,12,∞}F3: {29,32,∞} F4: {15,56,∞}
要求將其歸並為一個有序段並輸出。
如果這些輸入文件數據保存在內存中。輸出結果也不必輸出到文件,而是在屏幕上輸出就可以。
參考解答
#include <stdio.h>
#define MaxSize 20 //每一個文件裏最多記錄
#define K 5 //5路平衡歸並
#define MAXKEY 32767 //最大關鍵字值∞
#define MINKEY -32768 //最小關鍵字值-∞
typedef int InfoType;
typedef int KeyType;
typedef struct //記錄類型
{
KeyType key; //關鍵字項
InfoType otherinfo; //其它數據項,詳細類型在主程中定義
} RecType;
typedef struct
{
RecType recs[MaxSize];
int currec;
} FileType; //文件類型
typedef int LoserTree[K]; //敗者樹是全然二叉樹且不含葉子
RecType b[K]; //b中存放各段中取出的當前記錄
FileType F[K]; //存放文件記錄的數組
void initial()
{
int i; //5個初始文件,當前讀記錄號為-1
F[0].recs[0].key=17;
F[0].recs[1].key=21;
F[0].recs[2].key=MAXKEY;
F[1 ].recs[0].key=5;
F[1].recs[1].key=44;
F[1].recs[2].key=MAXKEY;
F[2].recs[0].key=10;
F[2].recs[1].key=12;
F[2].recs[2].key=MAXKEY;
F[3].recs[0].key=29;
F[3].recs[1].key=32;
F[3].recs[2].key=MAXKEY;
F[4].recs[0].key=15;
F[4].recs[1].key=56;
F[4].recs[2].key=MAXKEY;
for (i=0;i<K;i++)
F[i].currec=-1;
}
void input(int i,int &key) //從F[i]文件裏讀一個記錄到b[i]中
{
F[i].currec++;
key=F[i].recs[F[i].currec].key;
}
void output(int q) //輸出F[q]中的當前記錄
{
printf("輸出F[%d]的關鍵字%d\n",q,F[q].recs[F[q].currec].key);
}
void Adjust(LoserTree ls,int s)
//沿從葉子節點b[s]到根節點ls[0]的路徑調整敗者樹
{
int i,t;
t=(s+K)/2; //ls[t]是b[s]的雙親節點數據結構實踐——敗者樹歸並模擬