@Component
public class Sort {
private static Logger logger = LoggerFactory.getLogger(Sort.class);
/**
* 二分法查找
* 逻辑:
* 0,与中间元素比较,不断的获取中间元素下标
* 1,中间下标:(初始索引+结束索引)/2,奇偶无差别
* mid = (0+9)/2 4 偶
* mid = (0+8)/2 4 奇
* 2,定位初始和结束下标,目标所处中间下标位置
* mid右侧,low = mid + 1
* mid左侧,upper = mid - 1
*
* @return
*/
public static int search(int[] number, int des) {
int low = 0;
int upper = number.length - 1;// 最大下标
while (low <= upper) {
int mid = (low + upper) / 2;
if (number[mid] < des) {
low = mid + 1;
} else if (number[mid] > des) {
upper = mid - 1;
} else {
return mid;
}
}
return -1;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
int[] number = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int des = 2;
int result = search(number, des);
if (result == -1) {
logger.info("未找到");
} else {
logger.info("{}已找到:{}", "shenke", result);
}
}
}
https://blog.csdn.net/happyzwh/article/details/80398519
算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是有序不重复的。 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功;若 x 小于当前位置值,则在数列的前半段中查找;若 x 大于当前位置值则在数列的后半段中继续查找,直到找到为止。
假设有一个数组 { 12, 23, 34, 45, 56, 67, 77, 89, 90 },现要求采用二分法找出指定的数值并将其在数组的索引返回,如果没有找到则返回 -1。代码如下:
package cn.sunzn.dichotomy; public class DichotomySearch { public static void main(String[] args) { int[] arr = new int[] { 12, 23, 34, 45, 56, 67, 77, 89, 90 }; System.out.println(search(arr, 12)); System.out.println(search(arr, 45)); System.out.println(search(arr, 67)); System.out.println(search(arr, 89)); System.out.println(search(arr, 99)); } public static int search(int[] arr, int key) { int start = 0; int end = arr.length - 1; while (start <= end) { int middle = (start + end) / 2; if (key < arr[middle]) { end = middle - 1; } else if (key > arr[middle]) { start = middle + 1; } else { return middle; } } return -1; } }