二分查找
基本思想
假设序列是有序(升序)的,将序列中的中间位置的元素与关键字进行比较。如果相等则查找成功,否则利用中间位置记录将表分成前后两个子序列,当中间元素大于关键字时,则将前一个子序列的中间位置元素与关键字进行比较,相反将后一个子序列的中间位置的元素与关键字进行比较。重复以上步骤直到查找成功,或查找失败。
特点
- 待查找序列必须是有序;
- 从中间元素开始;
- 利用中间位置记录将表分成前、后两个子序列(除非已经找到);
- 如果中间位置记录的元素大于关键字,则进一步查找前一子序列,否则进一步查找后一子序列。
缺点
待查找序列必须是有序的
性能分析
时间复杂度:O(logn)
空间复杂度:O(1)
Java实现
public class BinarySearch {
public static void main(String[] args) {
int[] array = {10, 11, 12, 16, 18, 23, 29, 33, 48, 54, 57, 68, 77, 84, 98};
int key = 23; //关键字
int mid = binarySearch(array, key);
System.out.println("目标数字的所在的数组下标为:" + mid);
}
// 二分查找
public static int binarySearch(int[] array, int key) {
int left = 0; //指向数组的首位
int right = array.length - 1; //指向数组的末尾
while (left <= right) {
int mid = (right + left) / 2; //中间位置
//使用key与mid进行比较
if (key == array[mid]) {
return mid;
} else if (key > array[mid]) {
left = mid + 1;
} else if (key < array[mid]){
right = mid - 1;
}
}
return -1;
}
}