归并排序时间复杂度推导
生活随笔
收集整理的這篇文章主要介紹了
归并排序时间复杂度推导
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
眾所周知,歸并排序的時間復雜度是O(N*lgN)
歸并排序的時間復雜度推導書上網上一抓一把,但是多數證明都是基于N=2k這個假設來證明的,下面我給出一般情況的證明。
先上歸并排序代碼:
public class MergeSort implements Sort {private static int count = 0;@Overridepublic int[] sort(int[] data) {return sort(data, 0, data.length - 1);}private int[] sort(int[] data, int low, int high) {if (low == high) {return new int[] { data[low] };}int mid = (low + high) >> 1;int[] left = sort(data, low, mid); //(1)int[] right = sort(data, mid + 1, high); //(2)int[] result = new int[high - low + 1];int i = 0, k = 0;//(3) for (int j = 0; j < result.length; j++) {count++;if (i == left.length) {result[j] = right[k++];} else if (k == right.length) {result[j] = left[i++];} else {if (left[i] <= right[k]) {result[j] = left[i++];} else {result[j] = right[k++];}}}return result;}}
根據代碼可以看出,時間消耗主要在我標紅的3個地方,可以得出:
我們知道每一個整數都可以表示為2i+k的形式,如1=20+0,5=22+1,10=23+2,因此
設N=2i+k
令n=i+1,則有:
根據我們對i和k的定義,k<2i(不然如果k>=2i那么i就應該能取到i+1了)。
因此有:
所以有:
回到開頭的公式:
所以:
據此可以得出歸并排序的時間復雜度是O(N*lgN)。
?
轉載于:https://www.cnblogs.com/sheeva/p/6600666.html
總結
以上是生活随笔為你收集整理的归并排序时间复杂度推导的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 煮粽子为什么下面的没有上面的熟快?
- 下一篇: react+redux使用static