二分插入排序實際上是對插入排序的優化。
(1)算法思想
根據插入排序的思想,在插入待排序列的第i個元素時,由於前面的序列已經有序,因此可以使用二分法尋找第i個元素的正確位置。
(2)僞代碼:
BinInsertSort(int a[], int n)
{
int key, left, right, middle;
for (int i=1; i<n; i++)
{
key = a[i];
left = 0;
right = i-1;
while (left<=right)
{
middle = (left+right)/2;
if (a[middle]>key)
right = middle-1;
else
left = middle+1;
}
for(int j=i-1; j>=left; j--)
{
a[j+1] = a[j];
}
a[left] = key;
}
}
{
int key, left, right, middle;
for (int i=1; i<n; i++)
{
key = a[i];
left = 0;
right = i-1;
while (left<=right)
{
middle = (left+right)/2;
if (a[middle]>key)
right = middle-1;
else
left = middle+1;
}
for(int j=i-1; j>=left; j--)
{
a[j+1] = a[j];
}
a[left] = key;
}
}
(3)分析
1)穩定2)空間代價:Θ(1)3)時間代價:插入每個記錄需要Θ(log i)比較,最多移動i+1次,最少2次最佳情況Θ(nlog n),最差和平均情況Θ(n^2)。