對於大量的數據,直接插入排序的比較與移動的次數會比較多,在直接插入排序的基礎上,爲了減少比較的次數,實現了折半插入排序。
折半插入排序主要分爲兩個部分,第一部分就是找到待排數字應該插入的位置,第二部分就是移動數據,將待排數據插入有序數列中。
數據結構和直接插入排序的數據結構相同,在折半插入排序的代碼如下
void BInsertSort(sqList L,int len)
{
//這個是利用的書上的代碼
//在折半插入排序中分爲兩部分
//其中一部分是利用比較找到應該插入的位置
//另一部分是進行移動
if(len<=1) return;
for(int i=2;i<=len;i++)
{
//第一部分尋找應該插入的位置
int low=1,high=i-1;
L.r[0] = L.r[i];
while(low<=high)
{
int mid=(low+high)/2;
if(L.r[mid]<L.r[0]) low=mid+1;
else high=mid-1;
}
//low與high以後的數字都比待排序的數字大
//移動位置
for(int j=i-1;j>=high;--j)
L.r[j+1]=L.r[j];
L.r[high+1]=L.r[0];
}
cout<<endl;
cout<<"有哨兵的折半插入排序的結果"<<endl;
for(int i=1;i<=len;i++)
cout<<L.r[i]<<" ";
cout<<endl;
}
在這裏最容易出現小錯誤的地方放就是在比較查找需要插入的位置的時候 while(low<=high)循環,很容易糊塗這個等號要不要取,這個要哪個具體的實例,調試一遍程序就會印象深刻。
與直接插入排序相比,折半插入排序減少了比較的次數,直接插入排序,在尋找插入的位置時需要一個一個的比較,而折半插入排序是跳躍着比較,因此比較的次數減少,但是移動的次數依舊沒有減少。寫完代碼就能很清楚的看明白,折半插入排序的時間複雜度依然是o(n2),但是比較次數減少了