眾所周知,歸並排序的時間復雜度是O(N*lgN)
歸並排序的時間復雜度推導書上網上一抓一把,但是多數證明都是基於N=2k這個假設來證明的,下面我給出一般情況的證明。
先上歸並排序代碼:
public class MergeSort implements Sort { private static int count = 0; @Override public 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)。