1.什么是二分查找?(binary search)
二分查找是一种高效的查找方法,其基本思想是将目标值与数组中间的元素进行比较,如果目标值小于中间元素,则在数组的左半部分继续查找,否则在右半部分查找,不断缩小搜索范围,直到找到目标值或确定目标值不存在为止。
2.算法要求
1.必须采用顺序存储结构
2.必须按关键字大小有序排序
3.实现方法
例如:数组ccb[]={1,2,3,4,5,6,7,,8,9,10}
假设要查找的元素为3。
查找一次也就是折半一次,大大的提高查找的效率。
通过中间元素的变化,实现高效查找。
4.C语言实现
//整型有序数组的二分查找
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 5;
int left = arr[0];
int sz = sizeof(arr) / sizeof(arr[0]);
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
//中间值每次循环都要变化,否则中间值一直不变,会陷入while死循环。
if (arr[mid] < k)
{
left = mid + 1;
}
if (arr[mid] > k)
{
right = mid - 1;
}
if (arr[mid] == k)
{
printf("找到了,下标是:%d", mid);
break;
}
}
if (left > right)
{
printf("没找到。");
}
return 0;
}
方法2 自定义函数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int binary_search(int arr[], int k, int sz)//形参arr看上去是数组,本质上是指针。
// 数组传参实际上传递的是数组首元素的地址,而不是整个数组,
// 所以在函数内部计算一个函数参数部分的数组元素的个数是不靠谱的。
//所以sz=sizeof(arr)/sizeof(arr[]) 在函数内部算出的是不准确的。
//传递的是数组首元素的地址
{
int left = arr[0];
int right = sz - 1;
while(left<=right)
{
int mid = left + (right - left) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
if (arr[mid] > k)
{
right = mid - 1;
}
if (arr[mid] == k)
{
return mid;
}
if (left > right)
{
return -1;
}
}
}
//形参和实参的名字可以相同,也可以不同。
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);//输入需要查找的元素。
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr, k, sz);
//写一个函数进行查找。
//找到了,返回下标
//没找到,返回-1。不能返回0,因为有下标为0的元素。
if (ret == -1)
{
printf("没找到。\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}