java二分查找

来源:互联网 发布:网络电视怎么用遥控器 编辑:程序博客网 时间:2024/06/08 00:25

                二分查找

/*

二分查找  数组 必须 是有序 的


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



*/


一,数组 的查找功能

/** * 数组功能   查找 * 查找 当前位置的角标 */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;}


原创粉丝点击