面試-排序-(二)插入排序

一、插入排序:每一趟將一個待排序的元素,按其關鍵字的大小插入到已排序序列的適當位置,直到全部插入完成。

常見的插入排序有以下三種。

1、直接插入排序

1)過程:直接插入排序是一種最簡單的排序方法,其過程就是依次將每個元素插入到一個有序的序列中去。不過它有個缺點,就是當我們的數據基本有序時,每次插入都要移動位置,此時的插入效率是很低的。爲了解決這種情況,又產生了拆半插入排序,希爾排序。

工作原理:插入排序在實現上,從後面向前掃描(一開始從下標爲1的元素開始,往下標爲0的元素遍歷),在掃描過程中,需要反覆把已排序元素逐步向後挪位,爲最新的元素提供插入位置。

直接插入排序示意圖

2)python實現:

def sort3(a):
    for i in range(1,len(a)):
        for j in range(i,0,-1):
            if a[j-1] > a[j]:
                a[j],a[j-1] = a[j-1],a[j]
    return a

3)複雜度

空間複雜度:O(1)

時間複雜度:

平均 O( n^{2}

最好 O(n) :初始數據序列正序時

最壞 O( n^{2}) :初始數據序列反序時

 

2、拆半插入排序

1)過程:對直接插入排序尋找合適插入點時,用了類似二分法的尋位方法

2)python實現:

#折半插入排序=直接插入排序+二分查找
def sort4(a):
    for i in range(1,len(a)):
        tmp = a[i]
        low = 0
        high = i-1
        #查找位置
        while low <= high:
            mid = (low + high) // 2
            if tmp > a[mid]:
                low = mid +1
            else:
                high = mid -1
        #插入元素
        for j in range(i,low,-1):
            a[j] = a[j-1]
        a[low] = tmp
    return a

3)複雜度

空間複雜度:O(1)

時間複雜度:

平均 O( n^{2})

相比直接插入排序減少了關鍵字的比較次數,但元素的移動次數不變。

3、希爾排序

1)過程:希爾排序又稱縮小增量排序,基本思想:把元素按下標的一定增量d分組,對每組元素採用直接插入排序的方法進行排序,然後隨着增量不斷減小,直到d爲1,整個數據合爲一組有序序列。

希爾排序示意圖

2)python實現:

def sort5(a):
    step = len(a) // 2
    while step > 0:
        for i in range(step,len(a)):
            for j in range(i,0,-step):
                if a[j] < a[j-step]:
                    a[j],a[j-step] = a[j-step],a[j]
        step //= 2
    return a

3)複雜度

空間複雜度:O(1)

時間複雜度:

平均 O( n^{1.3})

最好 O(n)

最壞 O( n^{2} )

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