二分排序的问题

xiaoxiao2021-07-04  208

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; }
转载请注明原文地址: https://www.6miu.com/read-4821249.html

最新回复(0)