參考部落格:
單個順串的生成採用選擇置換演算法。
多路歸併採用敗者樹。
#include#include#include#include#includeusing namespace std;
#define max_int 0x7fffffff
#define min_int -1
const int kmaxsize = 100;
const int kmaxway = 10;
int buffer[kmaxsize]; //假設記憶體只能放1000000個整型.
int heap_size;
int num_of_runs;
struct run
;int ls[kmaxway]; //敗者樹,ls[0]是最小值的位置,其餘是各敗者的位置
run *runs[kmaxway];
void swap(int* arr, int i, int j)
void siftdown(int* heap, int pos, int size) //維護最小堆
}void buildheap(int* heap, int size)
//返回生成順串的數量
int generateruns(const char* in_file)
while (i == kmaxsize)
siftdown(buffer, 0, heap_size);
} if (heap_size != 0) //輸入緩衝區已空
}} //處理buffer中剩餘資料
if (i != 0)
out.close();
} return count1;
}void adjust(run **runs, int n, int s)
t /= 2;
} ls[0] = s;
}void createlosertree(run **rus, int n)
void mergesort(run** runs, int num_of_runs, const char* file_out)
// 將順串檔案的資料讀到緩衝區中
for (int i = 0; i < num_of_runs; i++)
runs[i]->length = j;
runs[i]->idx = 0;
} createlosertree(runs, num_of_runs);
ofstream out(file_out);
int live_runs = num_of_runs;
while (live_runs > 0)
runs[ls[0]]->length = j;
runs[ls[0]]->idx = 0;
} if (runs[ls[0]]->length == 0)
adjust(runs, num_of_runs, ls[0]); }}
void initdata();
int main()
void initdata()
外部排序 選擇置換 敗者樹
1.問題描述 由於在現實環境中,有時候需要對乙個非常大的檔案進行排序,而計算機記憶體是有限的,當資料無法完全存入記憶體時,則無法使用正常的排序演算法一次完成排序,而必須利用磁碟空間的輔助進行外部排序,即利用有限的記憶體每次讀入部分資料排序後得到乙個順串後暫時放到磁碟,最後將多個順串進行歸併直到最終完...
選擇置換 敗者樹搞定外部排序
個人認為,外部排序是我們在學習過程中接觸到的乙個比較重要的演算法,它既包含了基本的排序演算法,又考察了對檔案io 以及記憶體的理解,還展示了最基本的程式優化思想,可以說能夠寫好乙個外部排序,就說明基本的程式設計能力已經過關了。本文將對整個外部排序的過程進行詳細的分析,並介紹兩個經典演算法,最後附上完...
選擇置換 敗者樹搞定外部排序
個人認為,外部排序是我們在學習過程中接觸到的乙個比較重要的演算法,它既包含了基本的排序演算法,又考察了對檔案io 以及記憶體的理解,還展示了最基本的程式優化思想,可以說能夠寫好乙個外部排序,就說明基本的程式設計能力已經過關了。本文將對整個外部排序的過程進行詳細的分析,並介紹兩個經典演算法,最後附上完...