题目描述
给定一个有序的数组,查找某个数是否在数组中,请编程实现。
分析与解法
一看到数组本身已经有序,我想你可能反应出了要用二分查找,毕竟二分查找的适用条件就是有序的。那什么是二分查找呢?
二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它。其算法流程如下:
- 一开始,范围覆盖整个数组。
- 将数组的中间项与T进行比较,如果T比数组的中间项要小,则到数组的前半部分继续查找,反之,则到数组的后半部分继续查找。
- 如此,每次查找可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。
对于包含N个元素的表,整个查找过程大约要经过log(2)N次比较。
代码实现如下:
package com.cb.java.algorithms.programmingmethod.search;
/**
* 二分查找
*
* @author 36184
*
*/
public class BinarySearch {
public static void binarySearch(int[] num, int value) {
if (num == null || num.length <= 0) {
return;
}
int begin = 0;
int end = num.length - 1;
while (begin <=end) {
int middle = (begin + end) / 2;
if (num[middle] > value) {
end = middle - 1;
} else if (num[middle] < value) {
begin = middle + 1;
} else {
System.out.println("查找的数的下标为:" + middle);
break;
}
}
}
public static void main(String[] args) {
int[] num = { 1, 3, 5, 7, 9, 11, 12, 14, 23, 45 };
binarySearch(num, 9);
}
}