動畫 | 什麼是插入排序?

插入排序

file

插入排序是比較簡單也比較直接的一種排序算法。它是從一堆數據中取出一個數據並將它插入到已排序的數據中合適的位置。

比如按身高排隊,有一個人指揮排隊從第二個人開始,按身高把當前的人安插到之前排序好隊的合適的位置。

或者打撲克牌,假設我們拿到了10,J,K,A這四張牌,然後拿到了Q這張牌,那如何讓手中的五張牌變爲升序呢?如果我們只學了冒泡排序和快速排序,初始狀態是10,J,K,A,Q。

如果是用冒泡排序或者快速排序去做的話,那就可能不合適。結果是對,但是浪費了很多比較次數。

正常人最簡單的方式就是,把Q安插到J和K之間就可以了。

file

插入排序正是如此,它的思想就是維護一個有序區,把元素一個一個插入到有序區中的合適的位置,直到所有元素有序爲止。

視頻動畫

算法動畫視頻 地址

Code

file

Result

初始狀態 [5, 1, 3, 7, 4, 6, 2]發生交換 [1, 5, 3, 7, 4, 6, 2]1趟 [1, 5, 3, 7, 4, 6, 2]發生交換 [1, 3, 5, 7, 4, 6, 2]2趟 [1, 3, 5, 7, 4, 6, 2]3趟 [1, 3, 5, 7, 4, 6, 2]發生交換 [1, 3, 5, 4, 7, 6, 2]發生交換 [1, 3, 4, 5, 7, 6, 2]4趟 [1, 3, 4, 5, 7, 6, 2]發生交換 [1, 3, 4, 5, 6, 7, 2]5趟 [1, 3, 4, 5, 6, 7, 2]發生交換 [1, 3, 4, 5, 6, 2, 7]發生交換 [1, 3, 4, 5, 2, 6, 7]發生交換 [1, 3, 4, 2, 5, 6, 7]發生交換 [1, 3, 2, 4, 5, 6, 7]發生交換 [1, 2, 3, 4, 5, 6, 7]6趟 [1, 2, 3, 4, 5, 6, 7]

插入排序優化,減少不必要的交換次數

回顧一下上面代碼運行的結果,發現有很多次的交換,會有一點一點的時間上的消耗。如果我們做減少交換次數的代碼,那如何去寫呢?

回顧一下快速排序那篇文章,也使用了減少交換次數的方法。它是一個一個待比較完之後,定位最大的元素或者最小的元素,然後進行交換。

插入排序把待插入的元素做一個標記,和有序區一個一個元素去做比較。假設是從待插入元素的鄰近元素開始比較(從後往前),符合條件的前一個元素去複製粘貼到待插入元素的地址。直到不符合條件才插入到合適的位置。

視頻動畫

算法動畫視頻 地址

Code

file

Result

初始狀態 [5, 1, 3, 7, 4, 6, 2]發生複製 [5, 5, 3, 7, 4, 6, 2]1趟 [1, 5, 3, 7, 4, 6, 2]發生複製 [1, 5, 5, 7, 4, 6, 2]2趟 [1, 3, 5, 7, 4, 6, 2]3趟 [1, 3, 5, 7, 4, 6, 2]發生複製 [1, 3, 5, 7, 7, 6, 2]發生複製 [1, 3, 5, 5, 7, 6, 2]4趟 [1, 3, 4, 5, 7, 6, 2]發生複製 [1, 3, 4, 5, 7, 7, 2]5趟 [1, 3, 4, 5, 6, 7, 2]發生複製 [1, 3, 4, 5, 6, 7, 7]發生複製 [1, 3, 4, 5, 6, 6, 7]發生複製 [1, 3, 4, 5, 5, 6, 7]發生複製 [1, 3, 4, 4, 5, 6, 7]發生複製 [1, 3, 3, 4, 5, 6, 7]6趟 [1, 2, 3, 4, 5, 6, 7]

長按下圖二維碼關注公衆號,「算法無遺策」持續更新算法

file