本篇文章來聊一聊折半插入排序。
基本思想
先來回顧一下直接插入排序的算法思想,就是在前面已經排好序的子序列中尋找一個待插入的位置,然後將待插入元素插入到該位置上。
其中尋找插入位置的過程我們是與每一個元素進行比較,相當於順序查找,我們知道順序查找的效率是比較低的,那麼有沒有辦法能夠提高查找插入位置的效率呢?
很巧的是,前面的序列既然已經是有序的了,我們何不採用折半查找來找出插入位置呢?折半查找的前提就是序列有序,採用折半查找法查找插入位置的插入排序算法,我們稱其爲折半插入排序。
圖解排序過程
折半插入算法非常簡單,前提你得掌握直接插入排序和折半查找的算法,來看一個例子:
原序列的前四個元素已經有序,則從i位置元素開始進行插入排序,先將i位置元素存入下標0作爲哨兵,然後在子序列中尋找待插入位置。
這時我們可以採用折半查找法進行查找,定義三個變量low、high和mid,初始low = 1,high = i - 1,則mid爲2。
讓哨兵位置元素值與mid位置元素值比較,7大於5,所以插入位置應該在右半區,讓low = mid + 1,high不變,繼續折半查找: