首页 > 其他分享 >【c语言练习之二分查找】

【c语言练习之二分查找】

时间:2024-03-17 14:30:09浏览次数:21  
标签:二分 arr 下标 int 练习 mid 查找 key

二分查找

二分查找的前提

二分查找必须是在一个整形的有序数组中实现

二分查找的思想

对于一个整形的有序数组,输入一个你想要查找的数key,将key与数组的中间元素mid作比较,使得数组被分成2部分,要查找的数key肯定在某一部分,这样就可以舍弃另一部分,在另一部分中继续用这种思想,把剩余数组分成2部分,缩小查找的范围,直至找到key,或者输入的key不在这个数组中,程序结束。

二分查找的实现

下面是在一个整形数组中查找整数key = 7的过程
这是一个升序的整形数组arr[9]={1,2,3,4,5,6,7,8,9};
在这里插入图片描述

首先定义数组的左下标为Left = 0,右下标为Right = 8(数组元素个数-1)
中间元素下标 mid = (Left + Right)/2
输入要查找的key

int arr[9] = { 1,2,3,4,5,6,7,8,9 };
	int key = 0;
	scanf("%d", &key);//输入要查找的元素
	int Left = 0;//左下标为0
	int Right = 8;//右下标为数组元素个数-1,即9-1=8
	int mid = 0;//中间元素下标
	mid = (Left + Right) / 2;

第一次循环
Left=0,Right=8
下标mid=(0 +8)/ 2 = 4
我们要找key=7,将可以key与arr[4]=5作比较,发现key > arr[4]=5,所以要查找的数在arr[mid]的右边,所以右下标Right不变,左下标Left=mid+1=5

在这里插入图片描述

第二次循环
Left=5,Right=8
下标 mid =(5+8)/ 2 = 6
继续将key=7与arr[6]作比较,发现key==arr[6],找到了,打印下标mid=6
在这里插入图片描述

循环条件
while(Left<=Right)时,进入循环,查找key
如果循环结束,进入下面的if语句中,说明在数组中没找到key

if (Left > Right) {
		printf("很遗憾,不存在您要查找的数");
	}

代码部分

#include<stdio.h>
int main()
{
	int arr[9] = { 1,2,3,4,5,6,7,8,9 };
	int key = 0;
	printf("请输入你要查找的元素:");
	scanf("%d", &key);//输入要查找的元素
	int Left = 0;//左下标为0
	int Right = 8;//右下标为数组元素个数-1,即9-1=8
	int mid = 0;//中间元素下标
	while (Left <= Right)
	{
		mid = (Left + Right) / 2;
		if (key > arr[mid]) {
			Left = mid + 1;
		}
		else if (key < arr[mid]) {
			Right = mid - 1;
		}
		else {
			printf("你要查找的元素下标为:%d\n", mid);
			break;
		}//如果key==arr[mid],打印下标

	}
	if (Left > Right) {
		printf("很遗憾,不存在您要查找的数");
	}
	return 0;
}

二分查找的好处

如果不使用二分查找,在这样一个数组中,遍历数组,才能找到想要的数字,增加了程序的运行时间。
在这里插入图片描述

用遍历数组的方法查找

int main()
{
	int arr[9] = { 1,2,3,4,5,6,7,8,9 };
	int key = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
	scanf("%d", &key);
	//遍历数组
	for (int i = 0; i < sz; i++){
		if (arr[i] == key){
			printf("你要查找的元素下标为:%d\n", i);
		}
	}
	return 0;
}

标签:二分,arr,下标,int,练习,mid,查找,key
From: https://blog.csdn.net/2303_80390620/article/details/136779138

相关文章

  • Excel查找两列数据相同的元素
    =IF(ISERROR(MATCH(A1,$C$1:$C$5,0)),"",A1)//没找到返回空值,否则返回本身A1---单个数据$C$1:$C$5---数据堆在数据堆中查找是否有单个数据""---没有返回空白,此处可以修改为A1,A1---有返回本身,此处可以修改为空白----------------------------------------------------------......
  • 专题 | 二分&0/1分数规划&数学期望
    二分二分编号对于一个有单调性的数组,我们可以二分编号,如果a[mid]<ans,那么mid就往a[]更大的那边走while(r>l){mid=(l+r)/2;if(judge(mid))l=mid;elser=mid;}注意二分代码的写法细节和你的check函数有关!(其实是和你在对于恰好满足要求时check返回值有......
  • LeetCode题练习与总结:有效的数独
    一、题目请你判断一个 9x9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)注意:一个有效的数独(......
  • LeetCode题练习与总结:搜索插入位置
    一、题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。二、解题思路初始化两个指针,left指向数组的起始位置,right指向数组的结束位置。当left小于等......
  • 二分/二分查找(整数二分详解+拓展浮点二分)
    先上题目在一个有序数组中,查找x所在的下标。输入第一行两个整数n和m。第二行n个数,表示有序的数列。接下来m行,每行一个整数x,表示一个询问的数。输出对于每个询问如果x在数列中,输出下标。否则输出-1样例输入15334579738输出141-1提示对于100%的数......
  • unity+c#小项目练习 左右移动和碰撞
    创建首先,我们在Hierarchy面板创建两个cube,将其命名为player和player1,将player1的Scale均改为10,两者都要挂载上Rigidbody哦,切记!!!两者相撞还是会飞出去,是因为什么呢?因为两者质量是1,将player1的质量调成10,会被player推动,但是不会撞飞。懂了吧,质量!!!ok,我们来看看代码,这个是在scri......
  • 输入8个整数元素存入数组中,再输入一个整数n,在数组中查找,找到了返回数组元素的下标,找不
    #include<stdio.h>intmain(){inti,n,arr[8];//Input8integerelementsintothearrayprintf("Enter8integerelements:\n");for(i=0;i<8;i++){scanf("%d",&arr[i]);}......
  • 【2024年5月备考新增】《软考真题分章练习 - 5 项目进度管理(高项)》
    1、()isatechniqueforestimatingthedurationorcostofanactivityoraprojectusinghistoricaldatafromasimilaractivityorproject.A.AnalogousestimatingB.parametricestimatingC.Three-PointestimatingD.Bottomestimating2、下图中(单位:......
  • 查找redis永不过期的key
    keys*阻塞进程,消耗比较大,慎用#!/bin/bashhost=127.0.0.1port=6379output_file="never_expire_keys.txt"#获取所有键到keys.txt文件中redis-cli-h$host-p$portkeys"*">keys.txt#逐行读取keys.txt文件,查询每个键的TTLwhileIFS=read-rmykey;doresu......
  • 网络流建模之拆点,原理详解,OJ练习
    一、网络流建模之拆点1.1问题引入现有工厂s,仓库t,中转站若干,s到中转站有若干道路,中转站到仓库有道路若干,工厂要向仓库运输一定的货物,每条道路都有最大运输量限制,问最大运货量。1.2转化为网络流问题显然上述问题我们可以轻松的建模转化为网络流问题该流网络的最大流就......