- /**
- *
- * 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。
- *
- * 【基本思想】
- *
- * 将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
- *
- * 二分搜索法的应用极其广泛,而且它的思想易于理解。第一个二分搜索算法早在1946
- * 年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct
- * Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的。
- *
- *
- */
- public class BinarySearch{
- public static int search(int [] args, int target){
- int low = 0;
- int hight = args.length - 1;
- int mid;
- while(low<=hight){
- mid = (low+hight)/2;
- if(args[mid] == target){
- return args[mid];
- }
- else if(args[mid] > target){
- hight = mid - 1;
- }
- else
- {
- low = mid + 1;
- }
- }
- return -1;
- }
- public static <T extends Comparable>T search(T [] args, T target)
- {
- int low = 0;
- int hight = args.length - 1;
- int mid;
- while(low <= hight)
- {
- mid = (low + hight)/2;
- if(args[mid].compareTo(target) == 0)
- {
- return args[mid];
- }
- else if(args[mid].compareTo(target) > 0)
- {
- hight = mid -1;
- }
- else
- {
- low = mid + 1;
- }
- }
- return null;
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- System.out.print(BinarySearch.search(new int[] {2,9,11,13}, 2));
- System.out.print(BinarySearch.search(new String [] {"a", "b" ,"c"}, "b"));
- }
- }
/