折半搜索有序子表找到待插入位置,然後移動元素騰出位置並插入
//每趟先找到插入位置,然後移動、插入
void InsertSort2(int a[],int n){
int i,j,low,high,mid,k;
for(i=1;i<n;i++){//將a[1]~a[n-1]插入到前面已排序列
k=a[i];
low=0;
high=i-1;
while(low<=high){//尋找插入位置
mid=(low+high)/2;
if(a[mid]>k)
high=mid-1;//查找左半子表
else low=mid+1;//查找右半子表
}
for(j=i-1;j>=high;j--){//後移,騰出插入位置
a[j+1]=a[j];
}
a[high+1]=k;//插入
}
}