插入排序是比較簡單也比較直接的一種排序演算法。它是從一堆資料中取出乙個資料並將它插入到已排序的資料中合適的位置。
比如按身高排隊,有乙個人指揮排隊從第二個人開始,按身高把當前的人安插到之前排序好隊的合適的位置。
或者打撲克牌,假設我們拿到了10,j,k,a這四張牌,然後拿到了q這張牌,那如何讓手中的五張牌變為公升序呢?如果我們只學了氣泡排序和快速排序,初始狀態是10,j,k,a,q。
如果是用氣泡排序或者快速排序去做的話,那就可能不合適。結果是對,但是浪費了很多比較次數。
正常人最簡單的方式就是,把q安插到j和k之間就可以了。
插入排序正是如此,它的思想就是維護乙個有序區,把元素乙個乙個插入到有序區中的合適的位置,直到所有元素有序為止。
初始狀態 [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]
回顧一下上面**執行的結果,發現有很多次的交換,會有一點一點的時間上的消耗。如果我們做減少交換次數的**,那如何去寫呢?
回顧一下快速排序那篇文章,也使用了減少交換次數的方法。它是乙個乙個待比較完之後,定位最大的元素或者最小的元素,然後進行交換。
插入排序把待插入的元素做乙個標記,和有序區乙個乙個元素去做比較。假設是從待插入元素的鄰近元素開始比較(從後往前),符合條件的前乙個元素去複製貼上到待插入元素的位址。直到不符合條件才插入到合適的位置。
初始狀態 [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]
動畫 什麼是插入排序?
插入排序是比較簡單也比較直接的一種排序演算法。它是從一堆資料中取出乙個資料並將它插入到已排序的資料中合適的位置。比如按身高排隊,有乙個人指揮排隊從第二個人開始,按身高把當前的人安插到之前排序好隊的合適的位置。或者打撲克牌,假設我們拿到了10,j,k,a這四張牌,然後拿到了q這張牌,那如何讓手中的五張...
插入排序 折半插入排序
折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...
插入排序 折半插入排序
折半插入排序是基於直接插入排序的優化。直接插入排序 將第i個元素插入時,通過折半查詢的方式,來查詢第i個元素合適的位置。當0 i 1 位置上的元素都已經排序ok,現需要插入第i個元素,設其值為temp 令low 0,high i,mid high low 2。那麼temp可能插入的位置是 low h...