二分插入排序算法

插入排序的基本操作是 “有序插入”,也就是将元素按照大小的排布逐一插入到一个有序的数组中。对于数组a[n]通常认为a[0]为长度为1的有序数组,然后按照有序插入法,将后面的数组元素逐一插入到有序组中,这样一来,有序组的长度将不断增长,最后到达整个数组的长度,即整个数组为有序组,至此排序完成。

用二分查找法查找为元素a[i]查找有序位置时,需要找到 “有序位置” 之后将那些大于a[i]的元素一起右移;相较于直接插入排序,二分插入排序只是减少了比较次数,但元素的移动次数并没有改变,在最坏的情况下时间复杂性仍是 O(n^2)

C语言实现代码如下:

void Binary_Inert_Sort(int arr[], int len)
{
    int left, right, middle, temp;
    int index;//index:需要查找的有序位置的索引
    int  i, j;
    //控制插入的元素,第一次从下标为1的元素开始
    for (i = 1; i < len; i++)  
    {  //将前面arr[0]的当成已经排好序的数列,然后逐个插入
         left= 0;
         right= i - 1;
         temp = arr[i];
         index = i;
         //与头尾相比较如果没在范围内跳过循环
	     if (arr[0]<temp&&arr[i - 1]>temp) 
	     {
	     //二分法查找插入位置
	         while (left<= right) 
	         {
	             middle = (left+ right) / 2;
	             if (arr[middle] > temp)    right= middle - 1;
	             else  left= middle + 1;
	         }
	     //最后确定位置index
             index = left;
         }
         //如果比第一个元素还小就直接插到第一个位置
         if (arr[0] >= temp) index = 0;
         //如果比最后一个元素还大直接插到最后一个位置
         if (arr[i - 1] <= temp) index = i;
         //向后移位腾出插入空间
         for (j = i - 1; j >= index; j--) arr[j + 1] = arr[j];
         arr[index] = temp; //插入
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值