解决思想
1 二分查找要求查找的数据都是按照已经按照大小顺序放置好的数据【所以首先使用排序算法保证查找的数据范围中的数据是按照从小到大的顺序已经排好顺序的】
2 定义右边界【右边界开始时是数组的最大下标】和左边界【左边界开始时是数组的最小下标】使用中间变量,开始中间变量的数值为左边界和右边界的中间值【middle】
3 对中间值对应的数据与查找的数据大小进行比较,如果此时的数据值大于查找的数据【说明查找的数据位于排序好的数据的中间元素的左侧】 ,将数组的右边界设置为【middle】。反之,如果中间值对应的真实的数据的值小于查找的数据的数值的时候【说明超找的数据可能在中间值的右侧】此时,将左边界的值更新为【middle】 而后重新求解中间值【middle】
4 连续的执行操作3【采用循环的方式操作】 循环结束的条件是中间变量【middle】等于左边界或者右边界
5 查找结束
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void half_find(int a[],int len,int select_date){
if(a==NULL || len<=0) return ;
//对等待查找的数组中的元素进行排序【此处采用的是冒泡排序】
for(int i=0;i<len-1;i++){
for(int j=0;j<len-1-i;j++){
int temp;
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
//开始查找
int left;
int right;
int middle;
left=0;
right=len-1;
middle=(right-left)/2+left;
while(middle!=left && middle!=right){
//当找到相对应的数据的时候 结束查找操作 完成查找
if(a[middle]==select_date){
printf("find successful! The find_date`s value is :%d",a[middle]);
return ;
}
//如果此时的中间只对应的大于查找值 更新右边界 【right=middle】 而后再重新求解中间值
else if(a[middle]>select_date){
right=middle;
middle=(right-left)/2+left;
}
else{
left=middle;
middle=(right-left)/2+left;
}
}
printf("find fail! Don`t hava the value can suit for your find_date`s value!!!");
}
int main(){
//测试数据
int a[]={11,22,6,33,77,1,0,25};
int find_date;
scanf("%d",&find_date);
half_find(a,sizeof(a)/sizeof(a[0]),find_date);
printf("\n");
return 0;
}