1 题目
功能:二分查找描述: 使用二分查找特定关键字元素 用户输入有序数组的关键字后,给定要查找的关键字,看是否存在于有序数组中
2 思路
二分査找就是折半查找其基本思想:首先选取表中间位置的记录,将其关键字与给定关键字key进行比较,若相等,则査找成功;若key值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半査找;若key值比该关键字值小,则要找的元素一定在左子表中,继续对左子表进行折半査找;按照上述递推,直到查找成功或查找失败。
3 代码
#include <stdio.h>
#include <stdlib.h>
/**
功能:二分查找
描述:
使用二分查找特定关键字元素
用户输入有序数组的关键字后,给定要查找的关键字,看是否存在于有序数组中
**/
voidbinary_search(intkey,inta[],intn) {// 自定义函数binary_search
intlow,high,mid,count=0,count1=0;
low=0;
high=n-1;
while(low<high) { // 当查找范围不为0时执行循环体语句
count++; // count记录查找次数
mid=(low+high)/2; // 求出中间位置
if(key<a[mid]) // 当key小于中间值
high=mid-1; // 确定左子表范围
elseif(key>a[mid]) // 当key大于中间值
low=mid+1; // 确定右子表范围
elseif(key==a[mid]) { // 当key等于中间值证明查找成功
printf("查找成功!\n查找 %d 次!a[%d]=%d",count,mid,key);
// 输出查找次数及所查找元素在数组中的位置
count1++; // count1记录查找成功次数
break;
}
}
if(count1==0) // 判断是否查找失败
printf("查找失败!"); // 查找失败输出no found
}
intmain(intargc,charconst*argv[]) {
inti,key,a[100],n;
printf("请输入数组的长度:\n");
scanf("%d",&n); // 输入数组元素个数
printf("请输入数组元素:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]); // 输入有序数列到数组a中
printf("请输入你想查找的元素:\n");
scanf("%d",&key); // 输入要查找的关键字
binary_search(key,a,n); // 调用自定义函数
printf("\n");
}
示例结果:
$ gccex064.c-odemo
$ ./demo
请输入数组的长度:
10
请输入数组元素:
1
4
6
9
12
46
78
90
102
122
请输入你想查找的元素:
102
查找成功!
查找3次!a[8]=102