歸併排序中對小數組採用插入排序

來源:互聯網
上載者:User
純歸併排序的複雜度為: O(nlgn),而純插入排序的時間複雜度為:O(n^2)。資料量很大的時候採用歸併排序

但是在n較小的時候插入排序可能啟動並執行會更快點。因此在歸併排序中當子問題變得足夠小時,採用插入排序來使得遞迴的葉子變粗可以加快排序速度。那麼這個足夠小到底怎麼去衡量呢? 請看下面:

這麼幾個我不證明了,比較簡單:

A,插入排序最壞情況下可以在O(nk)時間內排序每個長度為k的n/k個子列表

B,在最壞情況下可在O(nlg(n/k))的時間內合并這些子表

C,修訂後的演算法的最壞情況已耗用時間複雜度是O(nk + nlg(n/k))

那麼,O(nk+nlg(n/k))=O(nlgn).只能最大是k=O(lgn).等式左邊中第一項是高階項。k如果大於lgn,則比歸併排序複雜度大了。左邊可以寫成nk+nlgn-nlgk,k等於lgn時,就是2nlgn-nlglgn.忽略恒定係數,則與歸併排序是一樣的。

最後結論: k < lg(n)的時候,使用插入排序

from at003_insertsort import insertSortfrom math import log__author__ = 'Xiong Neng'def mergeSort(seq):    mergeSortRange(seq, 0, len(seq) - 1, log(len(seq)) - 1)def mergeOrderedSeq(seq, left, middle, right):    """    seq: 待排序序列    left <= middle <= right    子數組seq[left..middle]和seq[middle+1..right]都是排好序的    該排序的時間複雜度為O(n)    """    tempSeq = []    i = left    j = middle + 1    while i <= middle and j <= right:        if seq[i] <= seq[j]:            tempSeq.append(seq[i])            i += 1        else:            tempSeq.append(seq[j])            j += 1    if i <= middle:        tempSeq.extend(seq[i:middle + 1])    else:        tempSeq.extend(seq[j:right + 1])    seq[left:right + 1] = tempSeq[:]def mergeSortRange(seq, start, end, threshold):    """    歸併排序一個序列的子序列    start: 子序列的start下標    end: 子序列的end下標    threshold: 待排序長度低於這個值,就採用插入排序    """    if end - start < threshold:        tempSeq = seq[start: end + 1]        insertSort(tempSeq)        seq[start: end + 1] = tempSeq[:]    elif start < end:  # 如果start >= end就終止遞迴調用        middle = (start + end) / 2        mergeSortRange(seq, start, middle, threshold)  # 排好左邊的一半        mergeSortRange(seq, middle + 1, end, threshold)  # 再排好右邊的一半        mergeOrderedSeq(seq, start, middle, end)  # 最後合并排序結果if __name__ == '__main__':    aa = [4, 2, 5, 1, 6, 3, 7, 9, 8]    mergeSort(aa)    print(aa)
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.