這是《漫談經典排序演算法系列》第四篇,解析了歸併排序。歸併排序又是另一類排序演算法,它是一種基於「分治」策略的一種演算法。歸併排序演算法是典型的分治演算法,對於規模較大的問題,可以分解成若干容易求解的簡單的問題,最後把解合併構成初始問題的解。詳細的排序過程可以參考《資料結構》或者《演算法導論》。各種排序演算法的解析請參考如下:
《漫談經典排序演算法:一、從簡單選擇排序到堆排序的深度解析》
《漫談經典排序演算法:二、各種插入排序解析及效能比較》
《漫談經典排序演算法:三、氣泡排序 && 快速排序》
《漫談經典排序演算法:四、歸併排序》
《漫談經典排序演算法:五、線性時間排序(計數、基數、桶排序)》
《漫談經典排序演算法:六、各種排序演算法總結》
注:為了敘述方便,本文以及源**中均不考慮a[0],預設下標從1開始。
[cpp]view plaincopy
#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).
歸併排序時間複雜度分析
主要參考了他的博文,他還講解了其他排序的時間複雜度分析及演算法實現。可以說合併排序是比較複雜的排序,特別是對於不了解分治法基本思想的同學來說可能難以理解。總時間 分解時間 解決問題時間 合併時間。分解時間就是把乙個待排序序列分解成兩序列,時間為一常數,時間複雜度o 1 解決問題時間是兩個遞迴式,把乙...
歸併排序時間複雜度分析
歸併 public void static main int leftarray newint num 2 public void static sort int begin,int end,int array,int leftarray public void static merge int b...
歸併排序時間複雜度 聽說你還不會歸併排序?
作者 超悅人生 責編 郭芮 本文介紹了歸併排序的基本思想,遞迴方法的一般寫法,最後一步步手寫歸併排序,並對其效能進行了分析。基本思想歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法的乙個非常典型的應用。即先使每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。這裡給出一...