折半插入排序基本思想:
折半插入即充分利用前面有序的特点,进行排序。先进行折半查找,找到合适位置后,再进行将待排元素插入该位置。
案例:
代码:
void BinaryInsertSort(Sqlist *L)
{
int i, j, low, high, mid;
for (i = 2; i <= L->length; i++)
{
L->R[0] = L->R[i];//设置哨兵
low = 1;
high = i - 1;
while (low <= high)//利用折半查找的算法查找插入的位置
{
mid = (low + high) / 2;
if (L->R[0].key < L->R[mid].key)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
for (j = i - 1; j >= high+1; j--) //元素后移,腾出空位供待插入元素存放
{
L->R[j+1] = L->R[j];
}
L->R[high+1] = L->R[0];//将当前待排序插入到指定位置
}
}
分析:
1.时间复杂度为O(n^2),只是减少了查找位置的时间,并没有减少移动元素的时间。