Python插入排序算法標準答案

Python插入排序

每一趟都要把待排序數放到有序區中合適的插入位置

Python插入排序的核心算法

結果可爲升序或降序排列,默認升序排列。以升序爲例
擴大有序區,減小無序區。圖中綠色部分就是增大的有序區,黑色部分就是減小的無序區
增加一個哨兵位,圖中最左端紅色數字,其中放置每一趟待比較數值
將哨兵位數值與有序區數值從右到左依次比較,找到哨兵位數值合適的插入點

Python插入排序的算法實現

1.增加哨兵位,爲了方便,採用列表頭部索引0位置插入哨兵位
2. 每一次從有序區最右端後的下一個數,即無序區最左端的數放到哨兵位
3. 比較與挪動

  • 從有序區最右端開始,從右至左依次與哨兵比較
  • 比較數比哨兵大,則右移一下,換下一個左邊的比較數
  • 直到找到不大於哨兵的比較數,這是把哨兵插入到這個數右側的空位即可

標準寫法

nums =  [1,9,8,5,6,11,22,3,3,5,66,76,11]
print(nums)
nums = [None]+nums
length  = len(nums)

for i in range(2, length):
    nums[0] = nums[i]
    j = i -1 
    if nums[j] > nums[0]:
        while nums[j] > nums[0]:
            nums[j+1] = nums[j]
            j-=1
            nums[j+1] =nums[0]
print(nums[1:])            
# 輸出-->>>
[1, 9, 8, 5, 6, 11, 22, 3, 3, 5, 66, 76, 11]
[1, 3, 3, 5, 5, 6, 8, 9, 11, 11, 22, 66, 76]

假如判斷交換次數,深入理解。

nums =  [1,9,8,5,6,11,22,3,3,5,66,76,11]
import random
random.shuffle(nums)

print(nums)
nums = [None]+nums
length  = len(nums)
count_move = 0


for i in range(2, length):
    nums[0] = nums[i]
    j = i -1 
    if nums[j] > nums[0]:
        while nums[j] > nums[0]:
            nums[j+1] = nums[j]
            j-=1
            count_move +=1
            nums[j+1] =nums[0]
print(nums[1:],count_move)            
# 輸出-->>>
[1, 3, 3, 5, 22, 5, 9, 11, 76, 11, 66, 6, 8]
[1, 3, 3, 5, 5, 6, 8, 9, 11, 11, 22, 66, 76] 18

變體寫法

nums = [1,9,8,5,6,11,22,3,3,5,66,76,11]
print(nums)
nums = [None] + nums


length = len(nums)

for i in range(2,length):
    nums[0]= nums[i]
    while 1:
        if nums[i]<nums[i-1] and i-1>0:
            nums[i],nums[i-1] = nums[i-1],nums[i]
            i-=1
        else:
            break
print(nums[1:])       
# 輸出-->>>
[1, 9, 8, 5, 6, 11, 22, 3, 3, 5, 66, 76, 11]
[1, 3, 3, 5, 5, 6, 8, 9, 11, 11, 22, 66, 76]

總結,

  • Python插入排序最好情況,正好是升序排列,比較迭代n-1次;最差情況,正好是降序排列,比較迭代1,2,…,n-1即 n(n-1)/2,數據移動非常多。
  • 使用兩層嵌套循環,時間複雜度O(n^2)
  • 屬於穩定排序算法
    如果待排序序列R中兩元素相等,即Ri等於Rj,且i < j ,那麼排序後這個先後順序不變,這種
    排序算法就稱爲穩定排序
    已經學習過的排序算法哪些是穩定排序,比如1、1、2排序,使用插入排序,1和1的相對位置不變。
    冒泡排序,相同數據不交換,穩定
    直接選擇排序,相同數據前面的先選擇到,排到有序區,不穩定
    直接插入排序,相同數據不移動,相對位置不變,穩定
  • 使用在小規模數據, 如果比較操作耗時大的話,可以採用二分查找來提高效率,即二分查找插入排序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章