二分排序的问题

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) 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]=low;i--){  //比插入值大的后移一位
      arr[i+1] = arr[i];
    }
        arr[low] = temp;
}

你可能感兴趣的:(二分排序的问题)