歸併排序時間複雜度 主定理

2021-07-22 14:14:33 字數 1601 閱讀 9775

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

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

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

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

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

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

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

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

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

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

[cpp]view plain

copy

#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...

歸併排序時間複雜度 聽說你還不會歸併排序?

作者 超悅人生 責編 郭芮 本文介紹了歸併排序的基本思想,遞迴方法的一般寫法,最後一步步手寫歸併排序,並對其效能進行了分析。基本思想歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法的乙個非常典型的應用。即先使每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。這裡給出一...