二分查找
/*
二分查找 数组 必须 是有序 的
java中 提供了二分查找 的方法
Arrays.binarySearch(arr2,45);
注意:如果利用java中提供的二分查找,如果查找 的元素不存在,它会返回这个元素的插入点,值为 负插入点减一
这里返回这个的原因是,返回负数是为了表示 这个元素不存在于这个数组 中,减去一是因为如果要插入的这个值是
数组的第一个元素,这时如果 返回 0 会让人误以为元素存在于这个数组中,且是第一个元素,所以这里减去一,
保证了这个元素不论是几,只要不存在于这个数组 中,就会返回一个负数;
例如
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100};int keyd = Arrays.binarySearch(arr2,45);
这里返回的是 -4
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100};
int key = Arrays.binarySearch(arr2, 10);
这里返回的是 -1
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100};
int key = halfSearch(arr2, 48);
这里返回的是 3
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100};int keyd = Arrays.binarySearch(arr2,45);这里返回的是 -4
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100};
int key = Arrays.binarySearch(arr2, 10);
这里返回的是 -1
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100}; int key = Arrays.binarySearch(arr2, 10); 这里返回的是 -1
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100};
int key = halfSearch(arr2, 48);
这里返回的是 3
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100};
int key = halfSearch(arr2, 48);
这里返回的是 3
int[] arr2 = {12, 23, 35, 48, 56, 65, 78, 100}; int key = halfSearch(arr2, 48); 这里返回的是 3
*/
一,数组 的查找功能
/** * 数组功能 查找 * 查找 当前位置的角标 */ public static int getIndex(int[] arr, int key) { for (int i = 0; i < arr.length; i++) { if (arr[i] == key) { return i; } } return -1; }二、二分查找/** * 二分查找 方法一 * */ public static int halfSearch(int[] arr, int key) { int min = 0; int max = arr.length - 1; int mid = (min + max) / 2; while (arr[mid] != key) { if (key > arr[mid]) { min = mid + 1; } else if (key < arr[mid]) { max = mid - 1; } if (max < min) { return -1; } mid = (min + max) / 2; } return mid; } /** * 方法二 * @param arr * @param key * @return */ public static int halfSearch_2(int[] arr, int key) { int min = 0; int max = arr.length - 1; int mid = (min + max) / 2; while (mid < max) { mid = (min + max) / 2; if (key > arr[mid]) { min = mid + 1; } else if (key < arr[mid]) { max = mid - 1; } else return mid; } return -1; }三、如果要在一个有序的数组中插入一个不存的元素,并且插入后数组还是有序的,
这时把二分查找 的返回值 变一下就行/** * 二分查找 方法一 * */ public static int halfSearch(int[] arr, int key) { int min = 0; int max = arr.length - 1; int mid = (min + max) / 2; while (arr[mid] != key) { if (key > arr[mid]) { min = mid + 1; } else if (key < arr[mid]) { max = mid - 1; } if (max < min) { return min; } mid = (min + max) / 2; } return mid; }