演算法 希爾排序

來源:互聯網
上載者:User

標籤:舉例   技術分享   size   希爾排序   ram   idt   param   images   集合   

希爾排序 Shell Sort

介紹:

  希爾排序(Shell Sort)也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。
  該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率比直接插入排序有較大提高。

執行流程:
  首先取一個整數d1=n/2,將元素分為d1個組,每組相鄰量元素之間距離為d1[一組內資料間隔是d1構成的分組],在各組內進行直接插入排序;
  取第二個整數d2=d1/2,重複上述分組排序過程,直到di=1,即所有元素在同一組內進行直接插入排序。
  通常每一次分組間隔都是上一次分組的一半,直到最後為1直接執行插入排序!

舉例:

  我們來看下希爾排序的基本步驟,在此我們選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇我們可以用一個序列來表示,{n/2,(n/2)/2...1},稱為增量序列。希爾排序的增量序列的選擇與證明是個數學難題,我們選擇的這個增量序列是比較常用的,也是希爾建議的增量,稱為希爾增量,但其實這個增量序列不是最優的。此處我們做樣本使用希爾增量。

希爾排序動態展示:

演算法實現:

def shell_sort(li):    """    希爾演算法 分組插入演算法,逐漸有序    :param li: 無序列表    :return: 有序列表    """    gap = len(li) // 2 #初始分組間隔    while gap > 0:        #組內排序        # 以0~(gap-1)位的數作為各自分組的第一個數        for i in range(gap, len(li)): #從gap位開始與自己組內資料比較            tmp = li[i] #擷取當前位置的值            j = i - gap #自己所在分組,間隔為gap的值            while j >= 0 and tmp < li[j]: #比較,如果當前值比前一個值小                li[j + gap] = li[j] #把大的值賦給當前位置                j -= gap #再去當前組內間隔為gap的值比較            li[j + gap] = tmp #否則的話就不變        #當前分組內值比較完成        gap = gap // 2 #間隔減半,組內再排序    return li

總結:
  希爾排序每趟並不使某些元素有序,而是使整體資料越來越接近有序;最後一趟排序使得所有資料有序。
  希爾排序是一種分組插入排序演算法。將原資料集合分割成若干個子序列,然後再對子序列分別進行直接插入排序,使子序列基本有序,最後再對全體記錄進行一次直接插入排序。
  最關鍵的是跳躍和分割的策略,也就是我們要怎麼分割資料,間隔多大的問題。通常將相距某個“增量”的記錄組成一個子序列,這樣才能保證在子序列內分別進行直接插入排序後得到的結果是基本有序而不是局部有序。

希爾排序的時間複雜度為: O(1.3n)

演算法 希爾排序

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.