簡單排序算法時間空間複雜度分析及應用(4)-二分插入排序
背景:
顧名思義,這個二分插入排序是直接插入排序的進化版,主要變化的地方就是在內循環部分,即外循環的循環節點在確定區域的位置查詢方式由原來的直接循環 比較變爲二分法的方式來查詢,在這確定區域數據都是已經排好序了的。
分析:
這種插入排序屬於插入排序中的先確定插入位置,後進行插入操作,因此在內循環中有兩個同級別的循環體。
代碼實現:
/*
* 二分法插入排序(binary insert Sort)
* 時間複雜度爲O(n的平方) ,最好的情況是元素交換次數爲0,元素比較次數爲n-1。
* @param sortOrder true表示增序,FALSE表示降序
* 第一種插入排序:這種插入排序有查找節點的步驟,採用的是二分法查詢,這種查詢方式只能在確定區域使用
* 這一種插入排序:插入排序改進,同級別的內循環有兩個,第一個是獲取插入位置,第二個是移動確定區域元素
*/
public static void insertSortBinary(boolean sortOrder){
int k ;
for(int m = 1 ; m < array.length ; ++m)
{
// for(n = m - 1 ; n >= 0 ; --n)
// if((array[m] > array[n]&&sortOrder)||(array[m] < array[n]&&!sortOrder))
// break;
/*
* 二分法查詢
*/
int p , q , mid;
p = 0 ;//確定區域起點
q = m-1;//確定區域終點
//錯誤點:我本來設計的就是可以相等,卻沒在這個不等式中表現出來!
while(p <= q)
{
mid = (p+q)/2;
if((array[mid] < array[m]&&sortOrder)||(array[mid] > array[m]&&!sortOrder))
{
p = mid + 1;
}
else
{
q = mid - 1;
}
}
int z ;
k = array[m];
for(z = m-1 ; z > p - 1 ; --z)
array[z+1] = array[z];
// if(array[m]!=k)
array[z+1] = k;
}
}
使用場景:
二分法插入排序和之前的一種直接插入排序幾乎一樣,只是這個插入排序中的插入位置查詢模塊使用了二分法查詢,這種插入排序適用於n數據量大且無序的情況,這樣會大大減少查詢的時間,從而爲整個插入排序節省時間,但是當大部分數據塊都是已排序的,使用二分法就不如直接插入排序來得好。
圖文解析:
這屬於插入排序的一種,圖文分析和之前的插入排序都一樣,可參考之前的插入排序圖文分析。