八大排序算法的python實現(二)希爾排序


代碼:

#coding:utf-8
#author:徐卜靈

# 希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因DL.Shell於1959年提出而得名。
# 希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序算法。
# 希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
# 插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率
# 但插入排序一般來說是低效的,因為插入排序每次只能將數據移動一位
L = [1, 3, 2, 32, 5, 4]
def Shell_sort(L):
    step = len(L)/2
    while step > 0:
        for i in range(step,len(L)):            #在索引為step到len(L)上,比較L[i]和L[i-step]的大小
            while(i >= step and L[i] < L[i-step]):      #這里可以調整step從小到大或者從大到小排列
                L[i],L[i-step] = L[i-step],L[i]
                i -= step
        step /= 2
    print L
Shell_sort(L)

#別人的希爾排序代碼
#引用網址:http://www.cnblogs.com/qlshine/p/6052223.html
# def shellSort(nums):
#     # 設定步長
#     step = len(nums)/2
#     while step > 0:
#         for i in range(step, len(nums)):
#             # 類似插入排序, 當前值與指定步長之前的值比較, 符合條件則交換位置
#             while i >= step and nums[i-step] > nums[i]:
#                 nums[i], nums[i-step] = nums[i-step], nums[i]
#                 i -= step
#         step = step/2
#     return nums
#
#
# if __name__ == '__main__':
#     nums = [9,3,5,8,2,7,1]
#     print shellSort(nums)

這個算法不難理解,但在寫程序的時候還是遇到了小小的麻煩。主要體現在它的時間復雜讀為O(n ** 1.3 )好奇怪的時間復雜度。

所以,在一次排序中,L[i]和L[i-step]的比較,一直循環到本組的第一個元素。

還需要注意一點是的索引是從step開始的。

時間復雜度最壞情況是O(n ** 2)

空間復雜度O(1)

並不是一個穩定的排序算法。


免責聲明!

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



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