為了更好地測試程式,首先利用以下方法生成了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個小檔案,每個小檔案都...