歸並排序時間復雜度推導


眾所周知,歸並排序的時間復雜度是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)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM