1.什么是二分查找
1.二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素必须是有序排列。
2.二分查找的条件
1.是一个有序数列。
2.必须是按照大小进行排序。
3.二分查找的实现原理
1.假设我们比较的有序数列有三个数,我们比较一个元素的值和数组中间位置的元素的值进行比较,如果比中间的元素大,则在有序数组的后半部分进行查找;如果中间位置的元素的值小,则跟有序数组的前半部分进行比较;如果相等,则找到了比较元素的位置。
3.1 流程
1.把待查找的元素与有序数组的中间位置的值进行比较,如果大于则比较后半部分,小于则比较前半部分。
2.此后,有序数组变为原来数组的前半部分或者后半部分。
3.继续执行第一步,依次比较元素与当前数组的中间值的大小。
例题:
写一个二分查找函数
功能:在一个升序数组中查找指定的数值,找到了就返回下标,找不到就返回-1.
#define _CRT_SECURE_NO_WARNINGS 1
// arr 是查找的数组
//left 数组的左下标
//right 数组的右下标
//key 要查找的数字
#include <stdio.h>
int bin_search(int arr[], int left, int right, int key)
{
int find = -1;//找不到就返回-1
while (left <= right)
{
int mid = (left + right) / 2;//中间的下标
if (arr[mid] < key)
{
left = mid + 1;//中间值比需要值小,左端向右移一位
}
else if (arr[mid] > key)
{
right = mid - 1;//中间值比需要值大,右端向左移一位
}
else
{
find = mid;//将中间下标赋值给查找值
break;
}
}
return find;//返回查找值
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数
int left = 0;//左端下标初始值为0
int right = sz - 1;//右端下标初始值为元素个数-1
int key = 0;
scanf("%d", &key);
int ret = bin_search(arr, left, right, key);//将函数返回值赋值给一个变量
printf("%d", ret);
return 0;
}
有不足之处或补充欢迎指出。
喜欢就一键三连吧~~~