二分查找/折半查找的定义
二分查找也称折半查找,它是一种效率较高的查找方法。
算法要求:
1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。
二分查找的基本思想是将n个元素分成大致相等的两部分,取a [n/2]与x做比较:
1.如果x=a [n/2],则找到x,算法中止;
2.如果x<a [n/2],则只要在数组a的左半部分继续搜索x,
3.如果x>a [n/2],则只要在数组a的右半部搜索x.
方法一:在主函数里查找
需知:sizeof() 是一种内存容量度量函数,功能是返回一个变量或者类型的大小(以字节为单位)。在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。
通过:sizeof(arr) / sizeof(arr[0]) 计算出数组的元素个数
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //输入一组有序数组
int sz = sizeof(arr) / sizeof(arr[0]);// 计算数组的元素个数
int left = 0; //初始化为数组的左下标
int right = sz - 1; 初始化为数组的右下标
int k = 7;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break; //找到后,终止循环
}
}
if (left > right)
printf("找不到\n");
return 0;
}
程序运行结果
方法二:自定义函数进行查找
#include<stdio.h>
int binary_search(int arr[], int k, int sz) // binary_search 译为 折半查找
{
int left = 0; // 最左边下标
int right = sz - 1; // 使数组个数-1,即为最右边下标
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
return mid; //找到时,把mid的值(数字的下标)传回主函数
}
}
return -1; //找不到时,返回-1
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; // 初始化
int sz = sizeof(arr) / sizeof(arr[0]); // 计算数组个数
int k = 7;
int ret = binary_search(arr, k, sz);
if (-1 == ret)
printf("找不到\n"); // 找不到就返回 -1
else
printf("找到了,下标是:%d\n", ret); //找到了,传递的是数组首元素的地址
return 0;
}
程序运行结果
结语
关于在有序数组内查找一个数字n的内容就到这里啦,大家有什么不理解的地方或者有什么更好的见解的话 欢迎给我留言哦。 q(≧▽≦q) 看完文章觉得有收获的麻烦大家点个赞吧!😊