【C语言】二分查找

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

一. 二分查找基本思路

有序表中,每次都取中间元素作为比较的对象。

如果给中间值与给定值相等,则查找成功,返回该元素的下标/索引;

如果中间值大于给定值,则在中间值的右半区间继续查找;

如果中间值小于给定值,则在中间值的左半区间继续查找;

确定了该元素所在范围那么范围外的元素就不需要查找了,不断重复上诉过程,直至找到

因为二分查找每次查找都可以剔除一半的查找范围,所以相比顺序查找每次一个一个元素查找,查找效率提高了很多。

二分查找需要两个必要条件:

1.数组元素必须有序

2.查找的数值不能多个,只能一个

二. 详细图解

例如:给定一个有序数组 nums = {1,2,4,5,7,8,11,15} 中,求数字7所在数组中的下标

二分查找过程:

 (1)定义两个指针 left 和 right ;left 指向首元素的下标,right 指向最后一个元素的下标。 traget 为目标值。即:

【C语言】二分查找

 (2)求中间元素的值mid,即:mid = left + (right - left) / 2 得到中间下标 通过中间下标可以访问到中间元素 nusm[mid] 。即:

【C语言】二分查找

问题:求中间值为什么不用 mid = (left + right) / 2 呢?

原因:如果是两个较大的值,相加超过了 int 取值范围(2147483647)就会导致溢出

 (3)使用中间值 nums[mid] 和目标值 target 对比,此时 nums[mid] < target 就证明 nums[mid] 左边的值 和 nums[mid]的值都不需要继续对比了。然后将 left 指针移动到 mid+1 的位置,查找范围就是 [mid+1,right] 。即:

【C语言】二分查找

 (4)继续对比,发现 nums[mid] > target。证明 nums[mid] 的值 和 nums[mid] 右边的值都不需要对比了。就让 right 指针移动到 mid-1 的位置。即:

【C语言】二分查找

(5)现在 nums[mid] 和 target 相等,然后返回 mid ,查找结束

下面来看一道经典的二分查找例题,加深理解

三. 例题

题目:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

来源:力扣(LeetCode)

示例1:

输入:nums = [-1,0,3,5,9,12],target = 9

输出:4

解释:9 出现在 nums 中并且下标为 4

示例2:

输入:nums=[-1,0,3,5,9,12],target = 2

输出:-1

解释:2 不存在 nums 中因此返回 -1

1. 第一步

首先是在一个有序的数组中查找某个元素的,那就需要一个数组来存放一些 int 类型的数据,可以通过题目看到除了输入一个数组 nums 外,还需输入一个目标值 target 

#include <stdio.h>
void main() {
	int nums[] = {-1,0,3,5,9,12};
	int numsSize = sizeof(nums) / sizeof(nums[0]);//数组大小
	int target= 0;//目标值target
	scanf("%d",&target);
}

2.第二步

写一个二分查找函数,并且定义两个指针 left 和 right,left 为首元素的下标,right 为最后一个元素的下标, 然后求中间元素的下标 mid ( mid = left + (right - left) / 2) 即:

【C语言】二分查找

#include <stdio.h>
int binarySearch(int nums[],int numsSize,int target) {
	int left = 0;//首元素下标
	int right = numsSize - 1;//末元素的下标(总长度-1,数组从0开始)

	//int mid = (left + right) / 2;//如果是两个较大的值超过了int类型的取值范围就会导致溢出
	int mid = left + (right - left) / 2;//中间元素的下标 防止溢出

}
void main() {
	int nums[] = {-1,0,3,5,9,12};
	int numsSize = sizeof(nums) / sizeof(nums[0]);//数组长度
	int target= 0;//目标值target
	scanf("%d",&target);
	printf("%d", binarySearch(nums,numsSize, target));
}

3.第三步

使用中间元素和目标值(target)对比,假如target = 9,那么 中间元素(5) < 目标值(9),中间元素左半部分的值及中间元素本身也就没有必要继续对比了,此时的查找范围为[mid+1,right],也就是 left = mid + 1,right位置不变,即:

【C语言】二分查找

问题: 如果我们查找的值是小于中间元素的时候呢?

回答:当 目标值 < 中间元素 时,就代表目标值在中间元素的左半部分,右指针就需要移动,也就是right = mid - 1,left不需要移动,此时查找范围为:[left,mid-1]。

大于和小于的情况都判断了,还有相等的情况,目标值 == 中间元素 时,就意味着找到该元素了,直接返回该下标即可。代码如下:

#include <stdio.h>
int binarySearch(int nums[],int numsSize,int target) {
	int left = 0;//首元素下标
	int right = numsSize - 1;//末元素的下标(总长度-1,数组从0开始)

	int mid = left + (right - left) / 2;//中间元素的下标 防止溢出
	int numsMid = nums[mid];//中间元素
	//目标值大于中间元素时
	if (numsMid < target) {
		//查找范围:[mid+1,right]
		left = mid + 1;
	}
	//目标值小于中间元素时
	else if (target < numsMid) {
		//查找范围:[left,mid-1]
		right = mid - 1;
	}
	else return mid;//相等时直接返回该元素下标

}
void main() {
	int nums[] = {-1,0,3,5,9,12};
	int numsSize = sizeof(nums) / sizeof(nums[0]);//数组长度
	int target = 0;//目标值target
	scanf("%d",&target);
	printf("%d", binarySearch(nums,numsSize, target));
}

4.第四步

最后就是重复执行上述过程了,每次都让目标值和中间元素对比,从而缩减查找范围,直至找到,如果没有的话返回-1

【C语言】二分查找

注意:

1.在查找元素时 left 和 right下标会越来越近甚至指向同一个下标,过程中 left 始终在 right 的左边(即:left <= right)。

2.如果一直找不到那个元素,两个下标必然会相互交错(即: left > right),这时循环结束。所以循环条件就是:while(left <= right)

最终代码:

#include <stdio.h>
int binarySearch(int nums[],int numsSize,int target) {
	int left = 0;//首元素下标
	int right = numsSize - 1;//末元素的下标(总长度-1,数组从0开始)
	
	while (left <= right) {
		int mid = left + (right - left) / 2;//中间元素的下标 防止溢出
		int numsMid = nums[mid];//中间元素
		//目标值大于中间元素时
		if (numsMid < target) {
			//查找范围:[mid+1,right]
			left = mid + 1;
		}
		//目标值小于中间元素时
		else if (target < numsMid) {
			//查找范围:[left,mid-1]
			right = mid - 1;
		}
		else return mid;//相等时直接返回该元素下标
	}
	return -1;//没有找到目标值,返回-1
}
void main() {
	int nums[] = {-1,0,3,5,9,12};
	int numsSize = sizeof(nums) / sizeof(nums[0]);//数组长度
	int target = 0;//目标值target
	scanf("%d",&target);
	printf("下标:%d", binarySearch(nums,numsSize, target));
}

运行结果:

【C语言】二分查找

5.总结

 二分查找最重要的两个点,就是循环条件和后续的区间赋值问题


关于二分查找的讲解到这里就结束了,如果有什么不对的地方欢迎在评论区指正,谢谢支持~

【C语言】二分查找文章来源地址https://www.toymoban.com/news/detail-462898.html

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

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

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

相关文章

  • 二分查找(C语言实现)

    二分查找的前提: 一个整形有序数组中 查找具体某个数 以下以数组元素为偶数个做例   二分查找(折半查找)的思想:对于已按排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根据试探结果继续分割,逐

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

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

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

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

    2024年02月06日
    浏览(38)
  • 【C语言】二分查找(含图解)

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

    2024年02月07日
    浏览(39)
  • Java 语言实现二分查找算法

    【引言】 二分查找算法是一种高效且常用的查找算法。它适用于已排序的数组或列表,并通过将目标值与中间值进行比较,来确定目标值在左侧还是右侧。本文将使用Java语言实现二分查找算法,并详细讲解其思想和代码实现。 【算法思想】 二分查找的核心思想是不断缩小查

    2024年02月11日
    浏览(34)
  • 【C语言】二分查找的实现

    前言 在我们日常生活中,经常会遇到查找一样东西的情景,比如在一个班的学生成绩中找到xx分对应的人 我们可以尝试用c语言程序解决这类查找问题 我们可以很容易写出这样的代码 这里数组arr中只有十个元素,那如果有100个,1000个,100000000…000个呢? 考虑最坏的情况,我

    2024年02月07日
    浏览(31)
  • 初阶算法(3):二分法的讲解与实现(C语言),以及二分不止光在有序数组中的应用

     第一章 初阶算法(1):通过简单的排序算法来认识时间复杂度  第二章 初阶算法(2):进行详细地介绍插入排序的细节和时间复杂度  第三章 初阶算法(3):二分法的讲解与实现,以及二分不止光在有序数组中的应用 目录 系列文章目录 前言 一、二分法的讲解与实现

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

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

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

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

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

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

    2024年01月17日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包