二分查找
实例说明:
本实例采用二分查找法查找特定关键字的元素。要求用户输入数组长度,也就是有序表的数据长度,并输入数组元素和查找的关键字。程序输出查找成功与否,以及成功时关键字在数组中的位置。例如,在有序表11、13、18、28、39、56、69、89、98、122中查找关键字为89的元素。
实现过程:
1. 在编译环境下创建一个C文件。
2. 引用头文件,代码如下:#include <stdio.h>
3.自定义函数binary_search(),实现二分查找,代码如下:
void binary_search(int key,int a[],int n){ //自定义函数binary_search()
int low,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小于中间值时
low = mid - 1; //确定左子表范围
else if(key > a[mid]) //key大于中间值时
low = mid + 1; //确定右子表范围
else if (key == a[mid]) //当key等于中间值时,证明查找成功
{
//输出查找次数及所查找元素在数组中的位置
printf("查找成功!\n查找 %d 次!a[%d]=%d",count,mid,key);
count1++; //count1记录查找成功次数
break;
}
}
if (count1 == 0) //判断是否查找失败
printf("查找失败!\n"); //查找失败输出no found
}
4. main()函数作为程序的入口函数,代码如下:
int main(int argc, char const *argv[])
{
int i,key,a[100],n;
printf("请输入数组的长度:");
scanf("%d",&n); //输入数组元素个数
printf("请输入数组元素:");
for ( i = 0; i < n; i++)
scanf("%d",&a[i]); //输入有序数列到数组a中
printf("请输入你要查找的元素:");
scanf("%d",&key); //输入要查找的关键字
binary_search(key,a,n); //调用自定义函数
printf("\n");
return 0;
}
完整代码展示:
#include <stdio.h>
void binary_search(int key,int a[],int n){ //自定义函数binary_search()
int low,high,mid,count = 0,count1 = 0;
low = 0;
high = n - 1;
while (low < high)
{
count++;
mid = (low + high) / 2;
if(key < a[mid])
low = mid - 1;
else if(key > a[mid])
low = mid + 1;
else if (key == a[mid])
{
printf("查找成功!\n查找 %d 次! a[%d]=%d",count,mid,key);
count1++;
break;
}
}
if (count1 == 0)
printf("查找失败!\n");
}
int main(int argc, char const *argv[])
{
int i,key,a[100],n;
printf("请输入数组的长度:");
scanf("%d",&n); //输入数组元素个数
printf("请输入数组元素:");
for ( i = 0; i < n; i++)
scanf("%d",&a[i]); //输入有序数列到数组a中
printf("请输入你要查找的元素:");
scanf("%d",&key); //输入要查找的关键字
binary_search(key,a,n); //调用自定义函数
printf("\n");
return 0;
}
运行结果展示:
技术要点:
二分查找就是折半查找,其基本思想是:首先选取表中间位置的记录,将其关键字与给定关键字 key 进行比较,若相等,则查找成功;若key值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半查找;若key值比该关键字值小,则要找的元素一定在左子表中,继续对左子表进行折半查找。如此递推,直到查找成功或查找失败(查找范围为0)。
希望能对您的学习和工作有所帮助!