/*c++语言解析
二分查找问题(也叫折半查找)
问题描述:给定一个有序序列,任意给定一个数值,
用二分查找法再序列中进行查找,如果在序列中,
给出该数在序列中的位置,否则输出“查询失败!”。
*/
#include <stdio.h>
#include <conio.h>
#define MAXSIZE 9
int BinSearch(int k[],int low,int high,int key){
int mid =(low+ high)/2;
if(low > high){
return -1;
}
else if(key == k[mid]){
return mid;
}
else if(key < k[mid]){
return BinSearch(k,low,mid-1,key);
}
else if(key > k[mid]){
return BinSearch(k,mid+1,high,key);
}
}
int main()
{
//给定有序序列,并输入要查询的数值
int a[MAXSIZE] = {-7,-2,0,5,16,43,57,102,291}; //二分查找:序列必须有序
int s[] = {5,16}; //待查询数值可以无序
int len = sizeof(s)/sizeof(s[0]);
//调用BinSearch函数进行查找,并输出查询结果
printf("查询结果:\n");
for(int i = 0; i < len; i++)
{
if (BinSearch(a, 0, MAXSIZE-1, s[i]) != -1 )
{
printf("%4d: %d\n",s[i],BinSearch(a, 0, MAXSIZE-1, s[i]));
}
else
{
printf("%4d: %d\n",s[i],BinSearch(a, 0, MAXSIZE-1, s[i]));
}
}
getch();
return 0;
}
/**
**Java语言分析
*/
public class dichotomy {
public static void main(String[] args){
int[] arr2=new int[]{-1,0,2,6,8,61,72,333};
int gre=55;
int head=0;
boolean isFlag=true;
int end=arr2.length-1;
if(isFlag){
while(head <= end){
int middle = (head+end)/2;
if(gre == arr2[middle]){
isFlag=false;
System.out.println("查询的位置是在"+middle);
break;
}else if( gre < arr2[middle] ){
end=middle-1;
}else if( gre > arr2[middle] ){
head=middle+1;
}
}
if(isFlag){
System.out.println("没有找到!");
}
}
}
}
算法分析:
把一个有序数组要查询的值和中间值比较,大于就查询右子序列,小于则是查找左子序列,中间则直接输出,然后左右子序列递归 调用,直至左右子序列为一。
算法时间复杂度: log2(n)