歸併排序 原始碼

2021-08-28 19:14:01 字數 1883 閱讀 7789

讀周顏軍; 王玉茹; 關偉洲. 資料結構 (21世紀高等教育計算機規劃教材) (p. 216). 人民郵電出版社. 此書原始碼也是摘自此書

歸併 排序( merge sort) 是 又一 類 不同 的 排序 方法。

歸併 排序 的 基本 思想: 將 已 有序 的 子 檔案 進行 合併, 得到 完全 有序 的 檔案。

合併 時 只要 比較 各 有序 子 檔案 的 第乙個 記錄 的 排序 碼, 排序 碼 最小 的 那個 記錄 就是 排序 後的 第乙個 記錄; 取出 這個 記錄, 然後 繼續 比較 各個 子 檔案 的 第乙個 記錄, 便可 找出 排序 後的 第二個 記錄; 如此 繼續 下去, 只要 經過 一 趟 掃瞄 就可以 得到 最終 的 排序 結果。

對於 排序 碼 任意 排列 的 待 排序 檔案 進行 歸併 排序 時, 可以 把 檔案 中的 n 個 記錄 看成 n 個子 檔案。

每個 子 檔案 只 包含 乙個 記錄, 顯然 對於 個子 檔案 來說 是 有序 的。

但是, 要想 只 經過 一 趟 掃瞄 就 將 n 個子 檔案 全部 歸併 成 乙個 有序 的 檔案 顯然 是 困難 的。

通常, 可以 採用 兩兩 歸併 的 方法, 即 每次 將 兩個 子 檔案 歸併 成 乙個 較大 的 有序 子 檔案。

第一 趟 歸併 後, 得到 個 長度 為 2 的 有序 子 檔案( 最後 乙個 子 檔案 長度 可 能為 1); 在此 基礎上, 再進 行 以後 各 趟 的 歸併, 每 經過 一 趟 後, 子 檔案 的 個數 約 減少 一半, 而每 個子 檔案 的 長度 約 增加 一倍。

如此 反覆, 直到 最後 一 趟 將 兩個 有序 子 檔案 歸併 到 乙個 檔案 中,這時 整個 排序 工作 就 完成 了。

上述 的 歸併 過程中, 每次 都是 將 兩個 子 檔案 合併 成 乙個 較 大的 子 檔案。 這種 歸併 方法 稱為 二路 歸併( 2- way merge) 排序。 類似 地 也可以 採用 三路 歸併 排序 或 多路 歸併( multi - way merge) 排序。

原始碼如下:

void merge(int x,int y, int low, int m, int high)

else

} if (i < m) }

if (j < high) }

}void mergepass(int x, int y, int n, int length)

if (i < n - length+1 )

else

//print(r, 15, length);

//print(r1, 15, length);

//system("pause");

mergepass(r1, r, n, length);

length = 2 * length;

}}int main(void) ;

//int x[12] = ;

//int x[23] = ;

int x[23] = ;

int b[25] ;

memset(b, 0x00, sizeof(b));

//mpsort(x, 12);

//mpsort2(x, 12);

//quitsort(x, 0, 11, 12);

//gb1(x, b, 0, 8, 15);

//gb2(x, b, 15, 1);

//gb3(x, 15,b);

mergesort(x, 15);

//mergesort(x,23);

print(x, 15, 8);

//print(x, 23, 8);

cout << endl<< "迴圈次數:" << gnum << endl;

system("pause");

return 0;

}

歸併排序原理及C 原始碼實現

建立在歸併操作上的一種有效 穩定的演算法,採用分治法,先使每個子串行有序,然後將以有序的子串行合併,得到完全有序的序列。若將兩個有序表合成乙個有序表,成為二路歸併。排序思想,一分為二,二分為四,四分為八,直到劃分到最細 然後逐漸合併回去。分的時候採用遞迴的方式進行。先把原始序列進行分組,劃分為多個子...

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...