1. 程式人生 > >插入排序,希爾排序

插入排序,希爾排序

# -*- coding: utf-8 -*-
"""
Created on Sun Nov 18 13:28:49 2018

"""
#插入排序難點
插入排序(英語:Insertion Sort)是一種簡單直觀的排序演算法。
它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。
插入排序在實現上,在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
'''
def insert_sort(alist):
    n=len(alist)
    for j in range(1,n):
        i=j
        while i>0:   #重點在交換後繼續比較
            if alist[i]<alist[i-1]:
                alist[i],alist[i-1] = alist[i-1],alist[i]  #i下標的資料前一個數據交換,但是i不變。i所在的位置的資料變了
                i-=1 #這兒的減一重點理解,可以舉一個列子比較容易理解
            else:
                break
alist=[3,2,6,1.5,1]
#對i-=1的解釋,比如i=3,此時alist[3]=1.5, alist[3]<alist[3-1]=alist[2]=6,
交換alist[3],alist[2] = alist[2],alist[3]   交換後 [3,2,1.5,6,1]  此時i-=1後  i=2,alist[2]是較小的那一個,由於i=2>0,然後繼續迴圈
alist[i]<alist[i-1]  一次向前比較


insert_sort(alist)
print(alist)
'''

#希爾排序
'''
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。
希爾排序的基本思想是:將陣列列在一個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列(步長更長了,列數更少了)來進行。
最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。
'''
def shell_sort(alist):
    n = len(alist)
    #初始步長
    gap = n//2
    
    while gap>0:
        #按步長進行排序
        for i in range(gap,n):
            j = i
        #插入排序
            while j>=gap and alist[j-gap]>alist[j]:
                alist[j-gap],alist[j] = alist[j],alist[j-gap]
                j -=gap
            
        gap=gap//2
        
alist = [54,26,93,17,77,31,44,55,20]
shell_sort(alist)
print(alist)