**二分查找**
二分查找又称为折半查找,是一种查询效率比较高的查找方法,但是二分查找的前提是要求线性表必须采用顺序存储结构而且表中元素按照关键字有序排列。
代码如下:
该程序在循环体内的关键在于三路分支的判断:如果小于则转向前一半,反之再判断如果大于则转向后一半,如果都不满足最后必然就是相等的情况,此时应该跳出循环,这三类情况下都趋向于缩短当前的区间或者跳出循环,可保证循环的终结,因此二分查找满足有穷性。
非递归(while循环)
package org.westos.demo3;
import java.util.Scanner;
public class Mytest8 {
public static void main(String[] args)
//数组中的元素必须是有序的
int []a={1,2,3,4,5,5,6,7,8,9,10};
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要查找的数字");
int key = sc.nextInt();
System.out.println(getNum(key, a));
}
private static int getNum(int key, int[] a) {
int low =0;
int high = a.length-1;
while (low<=high){
int mid = low+(high-low)/2;//这样写入可以防止溢出
if(key<a[mid]){ //小则去前半部分找
high = mid-1; //这里mid减一是可以的,因为待查的值已经小于a[mid].
}else if(key>a[mid]){ //大则去后半部分找
low = mid+1;
}else{ //找到则结束循环
return mid;
}
}
return -1;//不满足条件返回-1
}
}
时间复杂度分析
时间复杂度就是就是算法完全运行所需运算时间,在二分查找中时间复杂度可大致等于循环的次数。
第1次折半:还剩n/2个元素
第2次折半:还剩n/4个元素
第3次折半:还剩n/8个元素
……
第k次折半:还剩n/2^k个元素
代码在运行最坏的情况下,最后只剩1个元素,令n/2^k = 1。得k=logn。
时间复杂度O(logn)(以2为底的)。
使用递归方法
package org.westos.demo3;
import java.util.Scanner;
public class Mytest9 {
public static void main(String[] args) {
//数组中的元素必须是有序的
int []a={1,2,3,4,5,6,7,8,9,10};
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要查询的数字");
int key = sc.nextInt();
//int mid = low +(high-low)/2;
int low = 0;
int high = a.length-1;
System.out.println(getNum(key, a, low, high));
}
public static int getNum(int key, int[] a, int low, int high) {
int mid = low +(high-low)/2;
if(low>high){
return -1;
}
if(key < a[mid]) {
return getNum(key, a, low,mid-1);
}else if (key> a[mid]) {
return getNum(key ,a, mid+1, high);
}
else {
return mid;
}
}
}