在一个有序数组里找到一个数字K【二分查找法】
目录
思路分析
上代码
思路分析
表达有序数组:arr[ ]={1,2,3,4,5,6,7,8,9,10};
假定查找数字5,需要知道5在数组arr[ ]中的下标,下标应为4,即arr[4]
求数组元素个数:int sz = sizeof(arr) / sizeof(arr[0]);//数组空间的大小除以数组一个元素的大小
最左边下标表示为:int left = 0;
最右边下标表示为:int right = sz-1;//数组元素个数-1
查找数:k;
二分中间下标:mid;
二分中间数:arr[mid];
每一次二分查找时,找到中间下标,用中间下标 mid 表示的数字 arr[mid] 与查找数 k 比大小。
若arr[mid]>k,继续二分查找,则右下标向左移动,right = mid-1;
若arr[mid]<k,继续二分查找,则左下标向右移动,left = mid+1;
若arr[mid]=k,那么就找到了数字k。
注意,这一切的前提是left<=right;若left>right,则不可能找到k。
上代码
#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;int right = sz-1;int k = 0;scanf("%d", &k);while (left<=right){//int mid = (left + right) / 2;int mid = left + (right - left) / 2;if (arr[mid] < k){left = mid + 1;}else if (arr[mid] > k){right = mid - 1;}else{printf("找到了,下标是:%d\n", mid);break;}}if (left > right)printf("找不到\n");return 0;
}
可以看见,除了我们知道的(left+right)/2=mid,还有一种方法求mid,如下图
int mid = left + (right - left) / 2;
在一个有序数组里找到一个数字K【二分查找法】相关推荐
- C语言在一个有序数组里插入一个元素,使其成为一个新的有序数组
C语言在一个有序数组里插入一个元素,使其成为一个新的有序数组 #include<stdio.h> int main(){int a[11] = { 1,5,8,9,25,26,31,35, ...
- LeetCode 1060. 有序数组中的缺失元素(二分查找)
文章目录 1. 题目 2. 解题 2.1 一次遍历 2.2 二分查找 1. 题目 给出一个有序数组 A,数组中的每个数字都是 独一无二的,找出从数组最左边开始的第 K 个缺失数字. 示例 1: 输入: ...
- 考研数据结构之查找(9.8)——练习题之编写一个函数利用二分查找算法在一个有序表中插入关键字k并保持表的有序性(C表示)
题目 编写一个函数,利用二分查找算法在一个有序表中插入一个关键字k,并保持表的有序性. 分析 先在有序表中利用二分查找算法查找关键字值等于或小于k的结点,m指向正好等于k的结点或l指向关键字正好大于k ...
- 如何用二分查找法查找有序数组
一.程序简述 需要查找一个数字在数组中的位置,可以使用二分查找法在一个有序数组中查找具体的某个数字n 二.程序要点 1.普通的遍历查找方法的复杂度为n,那么二分查找算法的复杂度就是log2n 2.二分 ...
- 【leetcode】给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff数对。
给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k ...
- C语言二分法在一个有序数组查找数的算法(附完整源码)
C语言二分法在一个有序数组查找数 二分法在一个有序数组查找数 C语言分治法来计算pow(x,y)完整源码(定义,实现,main函数测试) 二分法在一个有序数组查找数 给定一个排序数组和一个数字. 用户 ...
- 698. 划分为k个相等的子集:给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。
题目描述 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 示例 1: 输入: nums = [4, 3, 2, 3, 5, 2, 1], k ...
- Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
问题内容是:给定一个数组,给定一个数字.返回数组中可以相加得到指定数字的两个索引. 比如:给定nums = [2, 7, 11, 15], target = 9 那么要返回 [0, 1],因为2 + ...
- C语言:向一个有序数组中插入一个数据,并保持数组的有序性。
C语言:向一个有序数组中插入一个数据,保持数组的有序性. #include <stdio.h> //向一个有序数组中插入一个元素,重新实现有序,并输出. int main() {//注意数 ...
最新文章
- Autohotkey puretext
- Activiti工作流从入门到入土:入门实例
- DCMTK:DcmSpecificCharacterSet类的测试程序
- 删除microsoft_如何从您的Microsoft帐户中删除设备
- 数学界最恐怖的存在,学过数学的人,一辈子都不会忘记!
- bzoj#4161-Shlw loves matrixI【常系数线性齐次递推】
- git 命令之 如何将本地新建分支推到服务器上
- git command not found
- 设计模式-----桥接模式(Bridge Pattern)(转)
- 那些年,我们一起学过的汇编----之子程序设计
- configparser读取含有中文的配置(Windows)
- vs2012安装VA插件
- ArcCatalog中连接SDE数据库
- mongoose populate 填充
- RabbitMQ入门学习笔记
- 慕学在线--4、知识点二
- VVC代码学习之自定义数据结构阅读4
- 记一次连接已重置的调试过程
- 液晶弹性自由能计算_液晶性能参数的测试方法及原理.ppt
- 【软件测试】接口测试工具Charles之map remote setting