二分查找算法,java实现

时间:2023-03-09 02:44:53
二分查找算法,java实现

二分查找算法是在有序数组中用到的较为频繁的一种算法。

在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间复杂度为O(n),但二分查找算法则更优,因为其查找时间复杂度为O(log2 n)。

比如数组{0,1,2,3,4,5,6,7,8 9},查找元素6,用二分查找的算法执行的话,其顺序为:

1.第一步查找中间元素,即4,由于4<6,则6必然在4之后的数组元素中,那么就在{5,6,7,8,9}中查找,

2.寻找{5,6,7,8,9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下{5,6},按此类推就可以找到了。

二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。

public class BinarySearchDemo {
/**
* 非递归方法,利用while循环
*
* @param arr
* @param des
* @return
*/
public static int binarySearch(int[] arr, int des) {
int low = 0;
int high = arr.length - 1;
while (low <= high) {
// 使用 (low + high) / 2,如果low和high的和大于Integer.MAX_VALUE(在java中是2 23 -1),计算就会发生溢出,使(low + high)成为一个负数,然后被2除,结果当然仍是负数。
// int middle = (low + high) / 2;
int middle = low + (high - low) / 2;
if (arr[middle] == des) {
return middle;
} else if (arr[middle] < des) {
low = middle + 1;
} else {
high = middle - 1;
}
}
return -1;
} /**
* 递归查找
*
* @param arr
* @param des
* @param low
* @param high
* @return
*/
public static int binarySearch(int[] arr, int des, int low, int high) {
// int middle = (low + high) / 2;
int middle = low + (high - low) / 2;
if (des < arr[low] || des > arr[high] || low > high) {
return -1;
}
if (arr[middle] < des) {
return binarySearch(arr, des, middle + 1, high);
} else if (arr[middle] > des) {
return binarySearch(arr, des, low, middle - 1);
} else {
return middle;
}
} public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 17};
int des = 15;
System.out.println("所查找元素在数组中的下标为:" + binarySearch(arr, des));
System.out.println("所查找元素在数组中的下标为:" + binarySearch(arr, des, 0, 10));
}
}