一、概念
关于查找什么是查找呢?查找是指:根据给定的某个值,在查找的对象中找到等于给定值的记录或者数据元素。查找的目的是什么呢?通俗移动的来说就是为了进行增删改查。折半查找也被称为二分查找,是效率高于直接查找的方法,适用于有顺序的顺序表。
使用时有两个要求:
1.必须采用顺序存储结构
2:顺序表的元素是有序排列的
二、思想
首先定义三个变量(我习惯定义)left 、right 、mid.他们分别指向顺序表的头部、尾部、中部,其中mid=(left+right)/2 得到,查找的值 key=21 ,如下所示:
关键:
1.查找位置从中间元素开始,若中间元素也就是mid=key,则返回查找元素的下标,查找结束。
2.若中间元素大于查找的值,则需要查找的元素在中间值的左边,需要重新确定right的位置,right=mid-1;
3.若中间元素小于查找的值,则需要查找的元素在中间值的右边,需要重新确定left的位置,left=mid+1;
4.当left>right时,则表示表中没有所要查找的值。
5.上述的操作都需要进行重复执行,我们用while(left<=right)循环来控制,left<=right是控制循环的条件。
好了,我们接着来看上面图片后续执行的过程。
第一次判断:key<mid,则有right=mid-1,mid=(0+5)/2=2;
第二次判断:key>mid,则有left=mid+1;mid=(3+4)/2=3;
第三次判断:key=mid;查找结束,返回该元素下标mid+1(因为数组下标是从0开始,所以要加1)。
三、代码实现
#define _CRT_SECURE_NO_WARNINGS 1//用vs编译时使用scanf会报错,加上就好了
#include <stdio.h>
int main()
{
int arr[] = {
05,13,19,21,37,56,64,75,80,88,92 };
int key;
printf("请输入你想查找的值:\n");
scanf("%d", &key);//定义变量用来存储想要查找的值
int left = 0;
int right = sizeof(arr) / sizeof(arr[0])-1;//计算数组的元素个数
while (left <= right)
{
int mid = (left + right) / 2;
if (key > arr[mid])
{
left = mid + 1;
}
else if (key < arr[mid])
{
right = mid - 1;
}
else
{
printf("查找成功,下标为 %d \n",mid+1);
break;//跳出循环,缺少break会一直打印查找成功,下标为找到元素的下标。
}
if (left > right)
{
printf("查找失败!\n");
}
}
return 0;
}
运行的结果: