首页 > 其他分享 >二分查找法

二分查找法

时间:2023-07-30 10:02:48浏览次数:37  
标签:二分 arr right int mid 查找 left

文章目录

二分查找法

适用于有序数组,顺序查找绝大多数情况有效但是由于它是一个一个元素进行查找,其效率很低,只有一个for循环

二分查找的关键:

找到最左边元素(left)和最右边元素(right),确定中间元素(mid)

int r = 0;
	scanf("%d", &r);
	int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int sz = sizeof(arr) / sizeof (arr[0]);
	int left = 0;
	int right = sz-1;

比较中间元素(mid)和目标元素(r)的大小,调整left和right,再确定新的mid…
接下来的问题在于怎样调整left和right的值,mid和k比较无非就三种情况:mid<r,mid>r,mid=r。第一种情况,r在mid的右边,我们将left调整为mid+1,right不用调整;第二种情况,r在mid的左边,我们将right调整为mid-1,left不用调整。最后一种情况最简单,我们已经找到了r,直接将mid打印出来就行了

int mid = (left + right) / 2;
		if (arr[mid] > r)
		{
			right = mid - 1;
		}
		else if (arr[mid] < r)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,它是:%d", arr[a]);
			break;
		}

我们要不断确定mid直到找到r,自然需要用到循环,我们有明确的目标:找到k。因此选择while循环,找到k后循环不再进行,而当left和right之间还有元素,即left在right的左边或与之重合,k就依然可能存在,所以循环条件为left<=right,

while (left <= right)
{
}

完整代码如下:

二分查找法演示

#include <stdio.h>


int main()
{
	int r = 0;
	scanf("%d", &r);
	int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > r)
		{
			right = mid - 1;
		}
		else if (arr[mid] < r)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,它是:%d", arr[mid]);
			break;
		}
	}
	return 0;

}
}


标签:二分,arr,right,int,mid,查找,left
From: https://blog.51cto.com/u_16182079/6898617

相关文章

  • abc312c <二分答案>
    题目C-InvisibleHand思路二分X,同时二分得到buyer和seller的人数(很精巧的二分~);当然,从复杂度角度,\(O(N\logN)\)也是可以的;实际上可以写成\(O(N)\)的形式?感觉线性扫描也可?代码点击查看代码#include<iostream>#include<algorithm>#include<vector>#include<cst......
  • 查找 SQL Server 中活动的 SQL 连接
    一、概述有多种方法可以找到SQLServer的活动SQL连接。本文分享一下几种常见的方法。二、解决方案2.1 SP_WHOSP_WHO作为查找SQLServer上运行的活动SQL连接的方法。SP_WHO将具有最少的列,但却是列出活动连接的快速方法。特别是当SQLServer上有阻塞时,可以找到阻塞和......
  • 用于查找 SQL Server 中死锁的 T-SQL 查询
    用于查找SQLServer中死锁的T-SQL查询 早些时候,我写了一篇关于使用扩展事件来查找SQLServer上发生的死锁的文章。扩展事件对于跟踪服务器上短时间内发生的死锁有很大帮助,尤其是在生产环境中。然而,在开发环境中,我遇到过当多个开发人员尝试对表执行dml语句时出现持续长......
  • 3-1 在上面有关折半查找的例子中,while 循环语句内共执行了两次测试,其实 只要一次就足
    ArchlinuxGCC13.1.1 202304292023-07-2911:07:02星期六 点击查看代码#include<stdio.h>intbinsearch(intx,intv[],intn){intlow,high,mid;low=0;high=n-1;mid=(low+high)/2;while((low<=high)&&(......
  • 散列表的查找
    散列表的查找基本思想记录的存储位置与关键字之间存在的对应关系.使用哈希函数查找对应的数据就是直接将学生的学号当做下标来存储.这样就非常好查找如何让查找根据散列函数H(key)=k查找key=n,则访问H(n)=n的地址,若内容为n则成功.若查询不到,返回一个特殊值,空指针......
  • 最长单调上升子序列(贪心+二分)
    这个的思路就是再开一个数组,存储长度为i的最长上升子序列的最后一个数字是多少,这个数组可以保证递增,之后开始二分,只要当前这个数是大于i-1的数但小于i的数,那就可以更新i的数,这里就是贪心的思想,相同长度结尾数字越小越好intlen=0;for(inti=1;i<=n;i++){intl=1,r=......
  • 【C语言】二分查找算法
    在⼀个升序的数组中查找制定的数字n,很容易想到的⽅法就是遍历数组,但是这种⽅法效率⽐较低,⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4...这样猜吗?显然很慢;⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了,这就是......
  • Windows | Linux 查找环境变量二进制所在目录
    1.Windows使用where命令wherejava2.Linux使用which命令whichjava......
  • Delphi 的 DBGrid 中的下拉列表和查找字段编程方法
    数据网格是非常流行的数据输入和显示形式,像大家熟悉的Excel、VFP 中的功能强大的BROWS 等,为广大程序员乐于采用。在用 Delphi 开发数据库应用系统时,利用数据网格DBGrid 输入数据时,有些字段只允许某几个固定的字符串,像档案案卷的保管期限,只有“永久”、“长期”和“短期”三种......
  • 单链表查找与删除
    单链表是一种常见的数据结构,它由一系列的节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。在单链表中,查找和删除节点是常见的操作。1.单链表查找:要查找单链表中的一个节点,需要从链表的头节点开始,沿着指针依次遍历每个节点,直到找到目标节点或者到达链表的末尾(即指针......