歸併排序實現及時間複雜度分析

2021-07-28 11:40:15 字數 841 閱讀 7284

歸併排序思想:

1.把序列分為兩部分,對兩部分分別排序(拆分的邊界條件:元素大於1個)

2.合併已排序兩部分

時間複雜度分析:

t(1) = 1;

t(n) = 2*t(n/2) + a*n;(a為常數,每次合併時,複雜度為o(n))

= 2*(2*t(n/4)+a*n/2) + a*n

= 4*t(n/4) + 2*a*n

= 4*(2*t(n/8)+a*n/4) + 2*a*n

= 8*t(n/8) + 3*a*n

=......

= 2^k*t(1) + k*a*n  (其中n==2^k,即k=log2(n))

= n + a*n*log2(n);

所以時間複雜度為o(nlogn)

#include #include #define n 10005

using namespace std;

int a[n], b[n];//b為輔助陣列,故空間複雜度為o(n)

void merge(int a, int s, int m, int e, int tmp)

while (p1 <= m)

tmp[p++] = a[p1++];

while (p2 <= m)

tmp[p++] = a[p2++];

for (int i = 0; i < p; i++)//把結果拷貝到全域性陣列a中

a[i + s] = tmp[i];

}void mergesort(int a, int s, int e, int tmp)

}int main()

排序演算法之 歸併排序及時間複雜度分析

歸併排序 歸併排序是建立在歸併操作上的一種有效排序演算法,該演算法是採用分治法的乙個典型應用。這裡的分治如何理解?比如我們要統計本縣城的高考狀元,而乙個縣城中有很多中學,每個中學又有若干個班級,每個班級有若干名學生,每個學生是乙個單獨個體,看成陣列中的乙個元素。接下來,班級內學生兩兩組合併排好序組成...

歸併排序時間複雜度分析

主要參考了他的博文,他還講解了其他排序的時間複雜度分析及演算法實現。可以說合併排序是比較複雜的排序,特別是對於不了解分治法基本思想的同學來說可能難以理解。總時間 分解時間 解決問題時間 合併時間。分解時間就是把乙個待排序序列分解成兩序列,時間為一常數,時間複雜度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...