实现
package BinarySearch;
public class BinarySearch {
/**
* 二分查找递归算法
* @param a
* @param m 查找数
* @param left 起始下标
* @param right 终止下标
* @return 查找到的数组下标+1,即是数组中的第几个数
*/
public static int BinarySearch1(int[] a,int m,int left,int right){
int message = -1;
int mid;
int r;
mid=(left+right)/2;
if(m == a[mid]){
//中间的数正好是查找的数
message = mid+1;
}else if(right >= left){
if(a[mid] > m){
r=BinarySearch1(a,m,left,mid-1);
}else{
r=BinarySearch1(a,m,mid+1,right);
}
message = r;
}else if(left>right){
message = -1;
}
return message;
}
/**
* 二分查找非递归算法
* @param a 数组
* @param x 要查找的数
* @param n 数组大小
* 算法复杂度:最坏情况:O(logn)
* @return
*/
public static int BinarySearch2(int[] a, int x, int n){
int message = -1;//未找到x
int left = 0;
int right = n-1;
int mid;
while( left <= right )
{
mid = ( left + right ) / 2;
if( x == a[mid] ){
message = mid+1;
break;
}
if( x > a[mid] )
left = mid + 1;
else
right = mid - 1;
}
return message;
}
}
package BinarySearch;
import java.util.Scanner;
public class Main{
private static int MAX_SIZE = 10;
public static void main(String[] args){
int a[] = new int[MAX_SIZE];
System.out.println("请输入您要查找的序列个数:");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println("请输入升序排列的数列: ");
for(int i=0; i<n; i++){
a[i] = in.nextInt();
}
System.out.println("请输入需要查找的数: ");
int x = in.nextInt();
int r1 = BinarySearch.BinarySearch1(a,x,0,n-1);
int r2 = BinarySearch.BinarySearch2(a,x,n);
if(-1 == r1){
System.out.println("BinarySearch1:您查找的数不存在!!!");
}else{
System.out.println("BinarySearch1:您查找的数是该序列的第" + r1 + "个数");
}
if(-1 == r2){
System.out.println("BinarySearch2:您查找的数不存在!!!");
}else{
System.out.println("BinarySearch2:您查找的数是该序列的第" + r2 + "个数");
}
}
}
复杂度分析
T(n)=1 (n=1)
T(n)=T(n/2) + O(1) (n>=2)
最坏情况:O(logn)