二分排序的问题

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 voidbinaryinto(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; }

    推荐阅读