(排序算法的python實現及算法分析——插入排序(insertion sort)和謝爾排序(Shell Sort)

3 插入排序

原理:插入排序維持一個已排好序的子列表,其位置始終位於列表的前部,然後逐步擴大這個子列表至全表。
插入排序的比對主要是用來尋找“新項”的插入位置
在這裏插入圖片描述
通過比對,移動,然後將新項插入合適位置
在這裏插入圖片描述
python實現插入排序:

##插入排序
def insertionsort(alist):
    for index in range(1,len(alist)):
        currentvalue =alist[index]
        position=index 

        while position >0  and  alist[position-1] >currentvalue:
            alist[position]=alist[position-1]
            position =position-1
        alist[position] =currentvalue

alist3=[0,1,17,7,9,3,18,25,8]
insertionsort(alist3)
print(alist3)   ##[0, 1, 3, 7, 8, 9, 17, 18, 25]

算法分析:由於有n-1趟對比,每次比對逐漸增加1至n-1,因此算法複雜度爲O(n^2)。和選擇排序類似,插入次數爲n次,
注:由於移動操作僅包含1次賦值,是交換操作的1/3,所以插入排序性能會比選擇排序好些。

4 謝爾排序

從插入排序的比對次數至,越是接近有序,插入排序的比對次數就越少。
從這種情況入手,將無序表進行間隔,劃分爲子列表,每個子列表都執行插入排序。最後一趟爲標準的插入排序,由於較爲有序,這一趟僅需少數幾次移動即可完成操作。
過程示意圖:
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
python實現謝爾排序:

##謝爾排序
def shellsort(alist):
    sublistcount =len(alist)//2   #間隔設定
    while sublistcount >0:
        for startposition in range(sublistcount):   ##子列表排序
            gapinsertionsort(alist,startposition,sublistcount)

        print("after increments of size",sublistcount,"the list is",alist)

        sublistcount=sublistcount//2   ##間隔縮小

def gapinsertionsort(alist,start,gap):
    for i in range(start+gap, len(alist),gap):
        currentvalue=alist[i]
        position=i

        while position >=gap and alist [position-gap]>currentvalue:
            alist[position]=alist[position-gap]
            position =position-gap

        alist[position]=currentvalue
##測試實例:
alist4=[0,1,17,7,9,3,18,25,8]
shellsort(alist4)
print(alist4) 
## 輸出:
#after increments of size 4 the list is [0, 1, 17, 7, 8, 3, 18, 25, 9]
#after increments of size 2 the list is [0, 1, 8, 3, 9, 7, 17, 25, 18]
#after increments of size 1 the list is [0, 1, 3, 7, 8, 9, 17, 18, 25]
# [0, 1, 3, 7, 8, 9, 17, 18, 25]

算法分析:
謝爾排序以插入排序爲基礎,由於每趟都使得列表更加接近有序,這過程就會減少很多無效比對,
如果將間隔保持在2^k-1 (1,3,5,7,15,31等)謝爾排序的時間複雜度約爲O(n ^(3/2))。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章