有趣的事,Python永遠不會缺席!
如需轉發,請注明出處:小婷兒的python https://www.cnblogs.com/xxtalhr/p/10787464.html
一、插入排序(Insertion-Sort)
插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從后向前掃描,找到相應位置並插入。
把n個待排序的元素看成為一個有序表和一個無序表。開始時有序表中只包含1個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第一個元素,將它插入到有序表中的適當位置,使之成為新的有序表,重復n-1次可完成排序過程。
1、原理
-
從第二個元素開始和前面的元素進行比較,如果前面的元素比當前元素大,則將前面元素 后移,當前元素依次往前,直到找到比它小或等於它的元素插入在其后面
-
然后選擇第三個元素,重復上述操作,進行插入
-
依次選擇到最后一個元素,插入后即完成所有排序
2、舉例
舉個例子,假設我現在有一個數列[11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]需要使用插入排序,我們來看看使用插入排序的詳細步驟:
- 首先第二個元素99和前面的元素11比較,99>11,第一輪完了,列表是 1 [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]
- 然后,33作為比較元素,和前面的元素99比較,11<33<99交換位置,33插入到11和99之間,列表為 1 [11, 33, 99, 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]
- 接着,33<69<99交換位置,列表變為 1 [11, 33, 69, 99, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]
- 以此類推,69<77<99,77插入到69和99之間,列表變為 1 [11, 33, 69, 77, 99, 88, 55, 11, 33, 36,39, 66, 44, 22]
- 77<88<99, 88插入到77和99之間,列表變為 1 [11, 33, 69, 77, 88, 99, 55, 11, 33, 36,39, 66, 44, 22]
- 33<55<69<77<88<99,55插入到33和69之間,列表變為 1 [11, 33, 69, 77, 88, 99, 55, 11, 33, 36,39, 66, 44, 22]
- 。。。。。。。
- 最終得到列表 1 [11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]
注:從第二個元素開始,以此和前面的元素比較,找出相應位置插入。
二、代碼
代碼用jupyternotebook實現
1 def insertion_sort(arr): 2 """插入排序""" 3 # 第一層for表示循環插入的遍數 4 for i in range(1, len(arr)): 5 # 設置當前需要插入的元素 6 current = arr[i] 7 # 與當前元素比較的比較元素 8 pre_index = i - 1 9 while pre_index >= 0 and arr[pre_index] > current: 10 # 當比較元素大於當前元素則把比較元素后移 11 arr[pre_index + 1] = arr[pre_index] 12 # 往前選擇下一個比較元素 13 pre_index -= 1 14 # 當比較元素小於當前元素,則將當前元素插入在 其后面 15 arr[pre_index + 1] = current 16 return arr 17 18 insertion_sort([11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]) 19 20 21 # 返回結果[11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]
三、特點
插入排序的適用場景:一個新元素需要插入到一組已經是有序的數組中,或者是一組基本有序的數組排序。
-
- 比較性:排序時元素之間需要比較,所以為比較排序
- 穩定性:從代碼我們可以看出只有比較元素大於當前元素,比較元素才會往后移動,所以相同元素是不會改變相對順序
- 時間復雜度:插入排序同樣需要兩次循壞一個一個比較,故時間復雜度也為O(n^2)
- 空間復雜度:只需要常數個輔助單元,所以空間復雜度也為O(1)
- 記憶方法:想象成在書架中插書:先找到相應位置,將后面的書往后推,再將書插入
結果
Successfully !!!
有趣的事,Python永遠不會缺席!還不來加我,瞅什么瞅。