二分判定有序表插入位置方法:
// 有序表长度为j-1,第j 个记录为待插入记
//设置有序表区间,待插入记录送辅助单元
【算法10.3】
void InsertSort(S_TBL *s)
{ /* 对顺序表s 作折半插入排序*/
for(i=2;i<=s->length;i++)
{ s->elem[0]=s->elem[i]; /* 保存待插入元素*/
low=i;high=i-1; /* 设置初始区间*/
while(low<=high) /* 该循环语句完成确定插入位置*/
{ mid=(low+high)/2;
if(s->elem[0].key>s->elem[mid].key)
low=mid+1; /* 插入位置在高半区中*/
else high=mid-1; /* 插入位置在低半区中*/
}/* while */
for(j=i-1;j>=high+1;j--) /* high+1 为插入位置*/
s->elem[j+1]=s->elem[j]; /* 后移元素,留出插入空位*/
s->elem[high+1]=s->elem[0]; /* 将元素插入*/
}/* for */
}/* InsertSort */
【时间效率】
确定插入位置所进行的折半查找,关键码的比较次数至多为
,次,移动记录的次数和直接插入排序相同,故时间复杂度仍为O(n2)。是一个稳定的排序方法。