写个动机。之前上大学的时候听老师说二分法,那时候也记得自己听的七七八八,无非就是把要插入的数据跟中间的数据比,如果大的话就和右边的二分之一比,如果小就和左边的二分之一比。听着感觉是这么回事儿,但是最近想自己写写算法的玩意儿,发现用一个二分法来排序一个无序的数组,想了蛮久的。有必要记录一下。 static void sortArray(int[] array) { for (int i = 1; i < array.length; i++) { int temp = array[i]; int start = 0; //只去排序前面已经有顺序的元素,所以-1 int end = i - 1; //因为数组是从0开始算下标的,所以这边不是+1而是-1来计算中间的下标 int middle = start; while ((end - start) > 1 && (array[middle] != temp)) { middle = (start + end) / 2; if (temp < array[middle]) { //要放入的数比中间值小,要放入的值在左边插入 // if(temp>) end = middle; } else if (temp > array[middle]) { //要放入的数比中间值大,要放入的值在右边插入 start = middle; } else { //刚好相等,要放入的数就在这个位置 } } //从这个点开始到i位置的数据都要往右移动一个位置 int upPosition = 0; if (array[middle] == temp) { //刚好是中间相等 upPosition = middle; } else if (array[start] >= temp) { //插入进来的数是最小的,直接放在最左边 upPosition = start; } else if (array[end] <= temp) { //插入进来的数是最大的,直接放在最右边 upPosition = i; } else { //放入进来的数刚好就是:start<temp<end,这个区间 upPosition = end; } //从upPosition开始到i结束 for (int j = i; j > upPosition; j--) { array[j] = array[j - 1]; } array[upPosition] = temp; } for (int i = 0; i < array.length; i++) { System.out.print(array[i] + ","); } }
二分法
最新推荐文章于 2024-09-12 19:02:20 发布