折半插入排序是對直接插入排序的簡單改進,對於直接插入排序而言,當第i-1趟需要將第i個元素插入前面的0~i-1個元素序列中時,總是需要從i-1個元素開始,逐個比較每個元素,直到找到它的位置。這顯然沒有利用前面0~i-1個元素已經有序這個特點,而折半插入排序則改進了這一點。
對於折半插入排序而言,當需要插入第i個元素時,它不會逐個進行比較每個元素,而是:
(1)計算0~i-1索引的中間點,也就是用i索引處的元素和(0+i-1)/2索引處的元素進行比較,如果i索引處的元素值大,就直接在(0+i-1)/2~i-1半個範圍內進行搜尋;反之在0~(0+i-1)/2半個範圍內搜尋,這就是所謂的折半;
(2)在半個範圍內搜尋時,按照(1)的方法不斷地進行折半搜尋,這樣就可以將搜尋範圍縮小到1/2、1/4、1/8…,從而快速的確定插入位置;
反應到人為整理撲克牌的行為上是:新抽取一張牌後,我們要插入到左手邊的牌堆中,這時候我們選擇從牌堆中間開始比較起,根據比較的大小決定下一次比較的區間,如此下去我們便將新抽的牌插入到左手邊的牌堆中,並使得左手邊的牌依舊有序。
折半插入排序相比於直接插入排序的不同在於,折半插入排序的比較次數變少了,但是其移動元素的次數並沒有變,為n(n-1)/2,依舊和直接插入排序一樣,所以在不考慮比較次數的前提下,其時間複雜度為o(n2)。
折半插入排序是穩定排序。
排序演算法之折半插入排序
在直接插入排序的基礎上做的改進,直接插入排序在尋找插入位置時是從後到前依次比較,直到找到插入位置。而折半插入排序在尋找插入位置時,先與有序序列中的中間位置r mid 進行比較,如果比中間位置上的記錄大,則在r mid 1 n 中尋找,繼續與右區間的中間記錄進行比較 如果比中間位置上的記錄小,則在r ...
排序演算法 折半插入排序
include include define status int define max 20 typedef struct elemtype typedef struct sqlist 結構體的定義 void inital sqlist l 初始化陣列 bool lt int i,int j 比較...
排序演算法 折半插入排序
1.折半插入排序的定義 折半插入演算法是對直接插入排序演算法的改進,它通過 折半查詢 在比較區查詢插入點的位置,這樣可以減少比較的次數,但移動的次數不變。2.折半插入排序的流程 最後使之成為新的有序表,重複n 1次完成整個排序過程。3.折半插入排序的 實現public class binaryins...