折半插入排序
思路分析:通过对直接插入排序算法进行思考,我们可以知道插入排序方式首先需要为要插入的元素找到插入序列中合适的插入位置。通过折半((low+high)/2=mid)的方式,凭借一个mid来使得我们通过二分插入区的方式,不断缩小插入的区域,直到low>high时,我们即可找到元素的插入位置high+1。此种方式在时间复杂度上仍和直接插入排序算法处于同一个等级,但由于使用了折半的方式,所以在为插入元素寻找插入位置时会更加高效(尤其在数据量较大时)。
时间复杂度:最坏情况(整个序列逆序时)时间复杂度为O(n2),最优情况(整个序列初始顺序,从大到小时)时间复杂度为O(nlog2n),平均情况时间复杂度为O(n2)。
源代码:
void BinaryInsertSort(int R[],int n)
{
int i,j,low,mid,high,temp;
for(i=1;i<n;i++)
{
low=0;
high=i-1;
temp=R[i];
while(low<=high) //找到合适的插入位置high+1,如果中间位置元素比要插入元素大,则查找区域向低半区移动,否则向高半区移动
{
mid=(low+high)/2;
if(R[mid]>temp)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
for(j=i-1;j>=high+1;j--) //high+1后的元素后移
{
R[j+1]=R[j];
}
R[j+1]=temp; //将元素插入到指定位置
}
}