数据结构之折半查找(C语言)

数据结构之折半查找(C语言)

一、概念

关于查找什么是查找呢?查找是指:根据给定的某个值,在查找的对象中找到等于给定值的记录或者数据元素。查找的目的是什么呢?通俗移动的来说就是为了进行增删改查。折半查找也被称为二分查找,是效率高于直接查找的方法,适用于有顺序的顺序表。

使用时有两个要求:

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;
}

运行的结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_70638216/article/details/131160639