漫談經典排序演算法 四 歸併排序 合併排序

2021-06-01 08:41:04 字數 1567 閱讀 5373

這是《漫談經典排序演算法系列》第四篇,解析了歸併排序。

各種排序演算法的解析請參考如下:

《漫談經典排序演算法:一、從簡單選擇排序到堆排序的深度解析》

《漫談經典排序演算法:二、各種插入排序解析及效能比較》

《漫談經典排序演算法:三、氣泡排序 && 快速排序》

《漫談經典排序演算法:四、歸併排序》

《漫談經典排序演算法:五、線性時間排序(計數、基數、桶排序)》

《漫談經典排序演算法:六、各種排序演算法總結》

注:為了敘述方便,本文以及源**中均不考慮a[0],預設下標從1開始。

歸併排序又是另一類排序演算法,它是一種基於「分治」策略的一種演算法。歸併排序演算法是典型的分治演算法,對於規模較大的問題,可以分解成若干容易求解的簡單的問題,最後把解合併構成初始問題的解。詳細的排序過程可以參考《資料結構》或者《演算法導論》。

view plain

#include

#include

#define infinite 1000

//對兩個序列進行合併,陣列從mid分開

//對a[start...mid]和a[start+1...end]進行合併

void

merge(

int*a,

intstart,

intmid,

intend)  

else

}  free(array1);  

free(array2);  

}  //歸併排序

void

mergesort(

int*a,

intstart,

intend)  

}  void

main()  

;//不考慮a[0]

mergesort(a,1,6);  

for(i=1;i<=6;i++)  

printf("%-4d"

,a[i]);  

printf("\n"

);  

}  

可以說合併排序是比較複雜的排序,特別是對於不了解分治法基本思想的同學來說可能難以理解。總時間=分解時間+解決問題時間+合併時間。分解時間就是把乙個待排序序列分解成兩序列,時間為一常數,時間複雜度o(1).解決問題時間是兩個遞迴式,把乙個規模為n的問題分成兩個規模分別為n/2的子問題,時間為2t(n/2).合併時間複雜度為o(n)。總時間t(n)=2t(n/2)+o(n).這個遞迴式可以用遞迴樹來解,其解是o(nlogn).此外在最壞、最佳、平均情況下歸併排序時間複雜度均為o(nlogn).從合併過程中可以看出合併排序穩定。 

用遞迴樹的方法解遞迴式t(n)=2t(n/2)+o(n):假設解決最後的子問題用時為常數c,則對於n個待排序記錄來說整個問題的規模為cn。

從這個遞迴樹可以看出,第一層時間代價為cn,第二層時間代價為cn/2+cn/2=cn.....每一層代價都是cn,總共有logn+1層。所以總的時間代價為cn*(logn+1).時間複雜度是o(nlogn).

原文出處:

漫談經典排序演算法 四 歸併排序 合併排序

這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線性時間排序 計數 基數 桶排序 ...

漫談經典排序演算法 四 歸併排序 合併排序

這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線性時間排序 計數 基數 桶排序 ...

經典演算法 歸併排序

題目說明 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法也是採用分治法 divide and conquer 的乙個非常典型的應用。演算法複雜度為o n logn 題目解析 歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半...