二分排序的问题

1.中间数的确认取上位中位数还是下位中位数
数组下标从0~length-1
uppermid = length/2 (取到中间偏右0~1)
lowermid = (length-2)/2 (取到中间偏左0~1)
mid = (length-1)/2 (计算机向下取整,等同下位中位数)
即为(low+high)/2

2.开启循环最大数或最小数的选择是否直接选择mid
已比较过无需重复选择以相邻下标定义即可
high = mid-1 (if(innum)<mid) //在低半区
low = mid+1 (if(innum>=mid)) //在高半区
3.避免新的mid运算过程中数据溢出
(low+high)/2 等价于(low+high)>> 1
不过low+high可能会超出数据类型所定义的最大值,造成数据溢出
故应该通过减法进行操作 mid=low+(high-low)/2

4.终止的条件
low>high //发生重叠

5.插入点的选择
插入数小于最小数则所有元素后移否则
low即为插入点下标,先将该元素即之后的元素后移一位,再将插入数插入到该位置

实现方法
1.while循环
2.递归调用//太卡了

以下为有序数组插入一个数的代码实现,最后一位为待插入数据

public static void  binaryinto(int[] arr){
 int temp = arr[arr.length-1];  //temp存放需插入的值
 int low = 0;                   //low存放查找下界索引
 int high = arr.length-2;       //high存放查找上界索引
 int mid = arr.length-2;        //中间元素下标(偏左)
  while(low<=high){ //使low下标>high下标(j交叉),那么low位置即为该插入位置
      if(arr[0]>=arr[arr.length-1]) {
         break;}     //如果插入的比第一个数还小或等于不进行循环
      if(arr[mid]<arr[arr.length-1]){
         low = mid+1;
      }
     else{
          high = mid-1;
      }
  }
    for(int i = arr.length-2;i>=low;i--){  //比插入值大的后移一位
      arr[i+1] = arr[i];
    }
        arr[low] = temp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值