二分搜索法算法算是分治策略的一个典型的例子。
给定已排好序的n个元素a[0:n-1],先要在这n个元素中找出特定的一个元素x。
二分法的思想就是将n个元素分成个数大致相等的两半,根据a[n/2]与x值大小的对比,来判断下次查找的半个部分。
算法描述如下:
template<class Type>
int BinarySearch(Type a[],const Type& x,int n)
{
int left=0;int right=n-1;
while(left<=right){
int middle=(left+right)/2;
if(x==a[middle]) return middle;
if(x>a[middle]) left=middle+1;
else right=middle-1;
}
return -1;
}
其Java代码的实现如下:
package com.zly.base;
import java.util.Scanner;
/**
* 二分搜索法
* @author Administrator
*
*/
public class Dichotomy {
/**
* 查询数字位置
* @param a 数组
* @param x 查询的数字
* @param low 开始位置
* @param height 结束位置
*/
public static void getNumber(int[] a,int x,int low,int height) {
if(low==height){
System.out.println("不存在数字"+x);
return;
}
int count=(low+height)/2;
if(a[count]==x){
System.out.println("你要查找的数字"+x+"在第"+(count+1)+"位");
return;
}
if(a[count]>x){
height=count-1;
}
if(a[count]<x){
low=count+1;
}
getNumber(a, x, low, height);
}
public static void main(String[] args) {
Scanner sr=new Scanner(System.in);
System.out.println("请输入你要输入数字的个数:");
int count_=sr.nextInt();
int[] number=new int[count_];
for(int i=0;i<count_;i++){
System.out.println("请输入第"+(i+1)+"个数字:");
number[i]=sr.nextInt();
}
System.out.println("请输入你要查询的数字:");
int x=sr.nextInt();
getNumber(number, x, 0, number.length);
}
}
当然,为了避免用户输入的时候没有达到“已排序”的目的,可以在用户输入完成后,对用户的让输入结果进行排序。