【C语言】二分查找的实现

这篇具有很好参考价值的文章主要介绍了【C语言】二分查找的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

查找

前言

在我们日常生活中,经常会遇到查找一样东西的情景,比如在一个班的学生成绩中找到xx分对应的人

我们可以尝试用c语言程序解决这类查找问题

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;//被查找的元素
	int i = 0;
	for (i = 0; i < 10; i++)//遍历数组
	{
		if (arr[i] == k)
		{
			printf("找到了,下标是%d", i);
		}
	}
	return 0;
}

我们可以很容易写出这样的代码
【C语言】二分查找的实现

这里数组arr中只有十个元素,那如果有100个,1000个,100000000…000个呢?

考虑最坏的情况,我们所要找的元素正好处在数组的最后一个,那就意味着我们的循环要进行n次(当存在n个元素时)

这样程序的效率就会很低。

那我们有没有更好的查找方法呢?

当然有,就是我们今天要提到的二分查找。

那么二分查找是什么意思呢?

首先二分查找的前提是被查找的数组必须是有序

例如
【C语言】二分查找的实现
我们首先记录数组最左端的下标为left,最右边的为right。
求出中间元素的下标mid=(left+right)/2
判断被查找的元素(定义为k)中间元素的大小

如果arr[mid]>k
意思是中间元素的值大于被查找的元素,那么k就只能在中间元素的左侧,因为数组是有序的。

同理如果arr[mid]<k
意思是中间元素的值小于被查找的元素,那么k就只能在中间元素的右侧,因为数组是有序的。

如果arr[mid]=k
w这就意味着我们找到了被查找的数

这样我们其实就完成了一次二分查找

代码实现

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0, right = 9;//数组左边下标为left,右边下标为right
	int mid = 0;//定义数组中间元素下标为mid
	int k = 7;//定义待查找的数;
	mid = (right + left) / 2;
	if (arr[mid] < k)
	{
		left = mid + 1;
	}
	else if (arr[mid] > k)
	{
		right = mid - 1;
	}
	else
	{
		printf("找到了,下标是:%d", mid);//如果查找到元素,打印该元素下标;
	}

	return 0;
}

但是我们往往不能在一次查找中就把被查找的元素找到

所以我们如果想要准确查找出被查找的元素,就应该还需要继续进行这样的查找,所以我们将上述过程放在一个循环中

那么循环的条件是什么呢?

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

我们拿这个数组举例,假设我们被查找的数是k=7;
我们可以得到
left=0 right=9 mid=(0+9)/2=4
下标4对应的元素是5 5<7 所以将5右边的元素全部排除 left=mid+1=5
现在没有查找到,再来一次

left=5 right=9 mid=(5+9)/2=7

arr[7]=8 >被查找的元素k right=mid-1=6

left=5 right=6 mid=(5+6)/2=5 *

arr[5]=6 < 被查找的元素 left=mid-1=6

left=6 right=6此时left=right;

arr[6]=7=k 该元素被查找到 说明其中其中一个条件是left=right

如果我要找的元素在这个序列中并,没有出现 那么就会出现left>right的情况(可以按照上述的分析方法分析)

所以循环的条件是left<=right

代码如下

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0, right = 9;//数组左边下标为left,右边下标为right
	int mid = 0;//定义数组中间元素下标为mid
	int k = 0;
	scanf("%d", &k);//定义待查找的数;
	int flag = 1;//标志变量
	
	while (left <= right)
	{
		mid = (right + left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			flag = 0;
			printf("找到了,下标是:%d", mid);//如果查找到元素,打印该元素下标;
			break;//找到元素,跳出循环;
		}
	}
	if (flag == 1)
	{
		printf("找不到");
	}
	return 0;
}

到此我们就实现了二分查找
如果认为这篇博客对你有帮助,留下你的点赞和关注吧!

本文所使用IDE VS2022文章来源地址https://www.toymoban.com/news/detail-470453.html

到了这里,关于【C语言】二分查找的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】二分查找

    在 有序表 中,每次都取 中间元素 作为比较的对象。 如果给中间值与给定值相等,则查找成功,返回该元素的下标/索引; 如果中间值大于给定值,则在中间值的右半区间继续查找; 如果中间值小于给定值,则在中间值的左半区间继续查找; 确定了该元素所在范围那么范围

    2024年02月06日
    浏览(37)
  • C语言之二分查找

    目录 一、二分查找算法 二、分支语句中应注意的小点   所谓二分查找,就是要在一组 有序的数列 中,查找给定的数是否在此数列中。 最主要的步骤有三个: 1.确定被查找的范围的左右下标left、right 2.根据left和right,确定中间元素的下标mid 3.根据mid锁定的元素和查找的元素

    2023年04月22日
    浏览(38)
  • 【C语言】二分查找(含图解)

    二分法:二分查找算法是一种在 有序数组 中查找某一特定元素的搜索算法,其思想就是不断地将有序查找表“一分为二”,逐渐缩小搜索区域,进而找到目标元素。 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜 素过程结束; 如果某一特定元素

    2024年02月07日
    浏览(38)
  • 牛刀小试---二分查找(C语言)

    二分查找,也叫折半查找,是一种在 有序数组 中查找特定元素的算法。它通过比较中间元素和目标值的大小,将查找范围缩小为一半,直到找到目标元素或者查找范围为空。  1. 确定搜索范围:首先,需要确定要在哪个区间内进行查找。这可以通过比较目标值与中间元素的

    2024年01月17日
    浏览(36)
  • c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

             1、前提条件:数据有序,随机访问;          2、实现:递归实现,非递归实现          3、注意事项:                 循环退出条件:low =high,low = high.说明还有一个元素,该元素还要与key进行比较                 mid的取值:mid=(low + high)/2;mid = l

    2024年02月05日
    浏览(43)
  • 算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解

    引言,少年们,大家好。在这里祝大家元旦快乐,我是博主 那一脸阳光 ,今天来介绍二分查找 在计算机科学领域,搜索算法是数据处理和问题解决的重要工具之一。其中,**二分查找算法(Binary Search)**以其卓越的时间复杂度和简洁高效的实现,在众多搜索算法中脱颖而出

    2024年01月17日
    浏览(57)
  • java实现二分查找算法

    递归实现: public static int binarySearchRecursive(int[] arr, int target) {     return binarySearchRecursive(arr, target, 0, arr.length - 1); }   private static int binarySearchRecursive(int[] arr, int target, int low, int high) {     if (low high) {         return -1; // 没有找到目标元素     }          int mid = (low + high) / 2

    2024年04月09日
    浏览(42)
  • golang二分查找算法实现

    项目中使用到有序数组查找特定元素,简单记录下 Golang 中二分查找算法。 二分查找算法是一种在有序数组中查找特定元素的高效算法。它的基本思想是通过不断将查找范围缩小一半,来快速定位目标元素是否存在。该算法要求数组是有序的,这是因为有序数组的特性允许我

    2024年01月25日
    浏览(43)
  • 数据结构-查找(顺序查找与二分查找的讲解与代码实现)

    顺序查找概念:从表的另一端开始,一次将记录的和给定值进行比较,若某个记录的和给定的值相等,则查找成功,反之则查找失败。 ASL:平均查找长度 pi查找概率,ci查找次数 eg:序列1,2,3 查找1的次数为1概率为1/3,2为两次概率1/3,3的次数为3概率1/3  将12

    2024年02月06日
    浏览(68)
  • 折半查找(二分查找)的两种方法及实现 Python

    概念: 在计算机科学中,折半查找,也称二分查找,是一种在有序数组中查找某一特定元素的搜索算法。 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包