資料結構之排序 歸併排序

2021-06-19 06:11:25 字數 1005 閱讀 4828

四 歸併排序

歸併:把若干個有序的數列, 合成乙個有序的數列

如二路歸併:

void merge(int d1, int len1, int d2, int len2, int tmp)

while (i < len1)

tmp[k++] = d1[i++];

while (j < len2)

tmp[k++] = d2[j++];

}

1, 二路歸併排序

迭代法:

把待排數列(長度為len)中的每個元素看作乙個有序數列,兩兩歸併, 再以相鄰的兩個元素為乙個有序數列,兩兩歸併,重複以上步驟,直到有序數列的長度大於或等於len。

void merge(int d1, int len1, int d2, int len2, int d)

while (i < len1)

tmp[k++] = d1[i++];

while (j < len2)

tmp[k++] = d2[j++];

for (i = 0; i < k; i++)    // k 改為k-1可以嗎? 不可以!k是從0開始,且tmp[k-1]有值

d[i] = tmp[i];

}void merge_sort(int d, int len)

}

遞迴法:

把前後兩個有序序列「歸併」成乙個有序序列

前、後兩個有序序列,又由「歸併排序(遞迴)」得來!

(遞迴法)由整個有序往前推理(往無序的方向推理,也是初始的方向)(由「果」到「因」,所以應用遞迴演算法時,可以把結果看作已經實現)!

(迭代法)由無序往有序的方向推理(由「因」到「果」)

void merge_rec_sort(int d, int len)

注:歸併排序是穩定的排序

時間複雜度最好最壞都為o(nlgn)

資料結構 排序之歸併排序

歸併,即 遞迴合併 q 我們排序的目的是什麼?a 讓無序的序列變得有序。比如說,下面有乙個序列 排序前排序後 7654321 1234567 如果我們將這個序列從中間附近分開,分成兩個子串行,想辦法讓這兩個子串行變得有序。然後再把兩個有序的子串行合併成乙個有序的子串行,那麼我們的排序不就完成了嗎?如...

資料結構之歸併排序

介紹 歸併排序是建立在歸併操作上的一種有效的排序演算法,效率為o nlogn 歸併排序的實現分為遞迴實現與非遞迴 迭代 實現。遞迴實現的歸併排序是演算法設計中分治策略的典型應用,我們將乙個大問題分割成小問題分別解決,然後用所有小問題的答案來解決整個大問題。非遞迴 迭代 實現的歸併排序首先進行是兩兩歸...

資料結構之歸併排序

編寫乙個歸併排序程式,並在main函式中驗證結果 歸併排序 merging sort 是利用 歸併 技術進行排序,所謂歸併 是指將若干個已排序好的子表合併成乙個有序表 最簡單的歸併是將兩個有序的子表合併成乙個有序表。假設r low 到r mid 和r mid 1 到r high 是儲存在同乙個陣列中...