插入排序,希爾排序
阿新 • • 發佈:2018-11-30
# -*- 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)