折半插入排序是基於直接插入排序的優化。
直接插入排序
將第i個元素插入時,通過折半查詢的方式,來查詢第i個元素合適的位置。
當0~(i-1)位置上的元素都已經排序ok,現需要插入第i個元素,設其值為temp;
令low=0, high=i, mid=(high+low)/2。那麼temp可能插入的位置是:low~high。每一次迴圈對範圍的縮小都要保持這個性質不變。分兩種情況討論:
temp
temp>=array[mid]。既然temp>=array[mid],則一定不可能插入到mid位置上。所以:
low = mid + 1;
high = high;
那麼迴圈結束的條件是什麼呢?
結論:迴圈結束的條件是low==high,此時唯一確定temp的插入位置。
不管有多少個元素,都會最終分解成以下情況,然後得到low==high,確定插入位置。
high == low + 2 ——> mid = low+1;
如果temp=array[mid],則插入位置被直接確定下來,為high。
high==low+1——>mid=low;
如果temp=array[mid],則插入位置確定,為high。
package datastructureandalgorithms;
public
class
insertsort_binarysort
; system.out.
println
("折半插入排序(公升序):");
system.out.
println
("未排序陣列順序為:");
display
(array)
; system.out.
println
("-----------------------");
sort
(array)
; system.out.
println
("-----------------------");
system.out.
println
("經過排序後的陣列順序為:");
display
(array)
; system.out.
println()
;}// 折半插入排序
public
static
void
sort
(int
array)
else
}//此時low==mid
if(low != high)
for(
int j=i;j>low;j--
) array[low]
= temp;
system.out.
println
("經過第"
+ i +
"輪排序後:");
display
(array);}
}public
static
void
display
(int
array)
system.out.
println()
;}}
折半插入排序(公升序):
未排序陣列順序為:
4 2 8 9 5 7 1 6 3
-----------------------
經過第1輪排序後:
2 4 8 9 5 7 1 6 3
經過第2輪排序後:
2 4 8 9 5 7 1 6 3
經過第3輪排序後:
2 4 8 9 5 7 1 6 3
經過第4輪排序後:
2 4 5 8 9 7 1 6 3
經過第5輪排序後:
2 4 5 7 8 9 1 6 3
經過第6輪排序後:
1 2 4 5 7 8 9 6 3
經過第7輪排序後:
1 2 4 5 6 7 8 9 3
經過第8輪排序後:
1 2 3 4 5 6 7 8 9
-----------------------
經過排序後的陣列順序為:
1 2 3 4 5 6 7 8 9
插入排序 折半插入排序
折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...
插入排序 折半插入排序
package sort 折半插入排序 當序列是連續儲存時,對直接插入排序進行的改進 插入位置可以更快速找到 直接插入排序a 0 用作哨兵減少條件判斷,折半插入排序不需要哨兵a 0 位置存放實際元素 public class insertsort 統一後移,空出插入位置 for j i 1 j hi...
1 2插入排序 折半插入排序
1.2插入排序 折半插入排序 binary insertion sort 一.評估 穩定的排序演算法 時間複雜度o n 2 移動次數 最小值n 1,最大值 n 2 n 1 2,平均值 n 2 4。與直接插入相比較少了比較的次數。二.思想 逐一插入,折半比較。r 0 作用 哨兵 監視哨 暫存器。voi...