多路歸併排序的實現

2021-08-07 15:58:15 字數 1212 閱讀 8689

為了更好地測試程式,首先利用以下方法生成了1000000個整數,每個整數均不相同:

//生成隨機排列的1000000個數字,每個數字都不相同

const int

size = 1000000;

int num[size];

void produce()

srand((unsigned)time(null));

//隨機交換隨機的兩個數字

for(i=0;ifor(i=0;ifclose(f);

}

多路歸併的主要包括兩個步驟,第乙個步驟是對劃分好的小資料塊進行內部排序,第二步是歸併所有的小資料塊:

首先是內部排序,在此將1000000個資料分成十份,利用庫函式qsort()進行排序,將排好序的子資料塊分別寫入是個檔案中:

const

int fcount = 100000;

int tmp[fcount]; //記憶體中臨時陣列

int compare(const

void *first_num, const

void *second_num)

void innersort(string infname,int filenum)

qsort(tmp,fcount,sizeof(int),compare); //呼叫系統函式快排

for(i=0;ifprintf(fout,"%d ",tmp[i]);

}fclose(fout);

}fclose(fin);

clock_t end = clock();

cout

<<"內排時間用去: "

<"ms"

《然後是歸併多個子資料塊:

void externsort(int filenum)

while(true)

}fprintf(fout,"%d ",min);

if(fscanf(fin[j],"%d",&first_num[j])==eof)

}fclose(fout);

delete first_num;

delete finish;

for(i=0;idelete fin;

clock_t end = clock();

cout

<<"外排時間用去: "

<"ms"

<}

多路歸併排序

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

多路歸併排序

下面的問題描述及相關文字都參考於csdn中july的部落格,在此對july表示感謝。july的部落格位址如下 在對海量資料排序時,有時不能把資料全部匯入到記憶體中,這時需要用到多路歸併排序。比如輸入 乙個最多含有n個不重複的正整數 也就是說可能含有少於n個不重複正整數 的檔案,其中每個數都 小於等於...

多路歸併排序

雪壓枝頭低,雖低不著泥 今天準備放假,無聊看到乙個場景題,問題如下 有乙個檔案裡面儲存著很多很多很多的無序的數,然後要求進行乙個排序,記憶體限定,磁碟足夠 然後搗鼓了一下,學到了一種新技能 多路歸併排序 學習的過程是這樣的 第一步 把儲存著很多很多很多數的檔案進行切割,切割成n個小檔案,每個小檔案都...