Python排序算法(四)——插入排序


有趣的事,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永遠不會缺席!還不來加我,瞅什么瞅。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM