《数组》--DAY1--二分查找
分治算法——二分查找(返回下标)
1.定义:在有序列表中,每次查找范围折半
- 列表若存在重复元素,返回下标不唯一
- 优点:比较次数少,速度快,性能好;缺点:要求列表有序
- 注意区分
while(left < right)
还是while(left <= right)
;right=middle
还是right=middle-1
2.实现原理
先取mid=(right+left)/2,比较target与array[mid]。若target<array[mid],令right=mid-1,重新取mid=(right+left)/2;若target>array[mid],令left=mid+1,重新取mid=(right+left)/2。依次不断地推下去,若left>right则查找失败
3.代码实现
-非递归
#include<iostream>
using namespace std;
int binarysearch(int arr[], int n, int target)
{
int left = 0, right = n - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (target > arr[mid]) left = mid + 1;
else if (target < arr[mid]) right = mid - 1;
else return mid;
}
return -1;
}
int main()
{
int target = 26;
int arr[10] = { 1,5,7,13,17,23,26,36,48,88 };
int ans = binarysearch(arr, 10, target);
printf("target对应数组下标为:%d", ans);
return 0;
}
- 注意mid一定是在while循环里面进行更新,这样left和right才能同时一起进行更新,若mid在函数外面则mid永远等于4,这样left只更新到4+1=5,left<right=9,mid永远无法进行更新,此时while进入死循环!!!
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
-递归实现
#include<iostream>
using namespace std;
int binarysearch(int arr[], int left,int right, int target)
{
if (left > right) return -1;
int mid = (left + right) / 2;
if (arr[mid] == target) return mid;
//若全部使用if语句,需要使用return有返回值,否则这一条语句会一直执行下去
/*if (target < arr[mid]) return binarysearch(arr, left, mid - 1, target);
if (target > arr[mid]) return binarysearch(arr, mid+1, right, target);*/
else if (target < arr[mid]) binarysearch(arr, left, mid - 1, target);
else if (target > arr[mid]) binarysearch(arr, mid + 1, right, target);
}
int main()
{
int target = 26;
int arr[10] = { 1,5,7,13,17,23,26,36,48,88 };
int ans = binarysearch(arr, 0, 9, target);
printf("target对应数组下标为:%d", ans);
return 0;
}
- 容易在if与else if语句出现未定义行的错误!
4.总结--二分查找核心总结
二分查找以有序列表为前提,通过折半缩小范围,实现O(log n)高效搜索。关键陷阱在于边界控制:循环条件(left ≤ right时有效区间需闭合)、指针更新(mid±1避免死循环),以及递归必须显式返回结果。非递归以O(1)空间碾压递归的隐式栈消耗,而重复元素导致下标不唯一需特殊处理。注意要是数组很长,left+right可能会溢出,可写成mid=left+(right-left)/2)!
《数组》--DAY1--二分查找的更多相关文章
- PHP-----二维数组和二分查找
二维数组由行和列组成.由arr[$i][$j]表示,先后表示行和列,类似于坐标点. 打印二维数组-----通过两次遍历,第一次遍历每一行,第二次遍历每一行的具体元素,并且通过使用count($arr[ ...
- java 13-1 数组高级二分查找
查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...
- Java数据结构和算法总结-数组、二分查找
前言:在平时开发中数组几乎是最基本也是最常用的数据类型,相比链表.二叉树等又简单很多,所以在学习数据和算法时用数组来作为一个起点再合适不过了.本篇博文的所有代码已上传 github ,对应工程的 ar ...
- [c/c++] programming之路(15)、多维数组和二分查找法,小外挂
一.多维数组 #include<stdio.h> #include<stdlib.h> void main(){ ][]; int i,j; ; i < ; i++) { ...
- [算法][LeetCode]Search a 2D Matrix——二维数组的二分查找
题目要求 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...
- [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找
一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...
- 【大视野入门OJ】1083:数组的二分查找
Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output ...
- Java数组之二分查找
简单的二分查找 package com.kangkang.array; public class demo03 { public static void main(String[] args) { / ...
- leetcode:Search for a Range(数组,二分查找)
Given a sorted array of integers, find the starting and ending position of a given target value. You ...
- leetcode:Search a 2D Matrix(数组,二分查找)
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
随机推荐
- runoob-pandas(python)
https://www.runoob.com/pandas/pandas-tutorial.html Pandas 教程 Pandas 是 Python 语言的一个扩展程序库,用于数据分析. Pand ...
- bat脚本(批处理程序)调用WinRAR及7zip压缩和解压缩
最近项目要用到定期批量将文件及文件夹下的文档打包,所以想到要写脚本来实现,然后做Windows定期任务调用.bat脚本(批处理程序)调用WinRAR及7zip压缩和解压缩. 调用WinRAR来实现 因 ...
- c代码部分封装为lib
需求:将一个C工程中的核心代码封装为静态文件:lib. 环境 工具:VC6.0++ 语言:c 以封装一个DES工程为例 封装 (1)新建一个静态工程 (2)新建c文件和h文件 (3)挑选封装内容 在原 ...
- 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)
九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) @ 目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 1. RDB 概述 ...
- 定制Allure报告
定制Allure报告 自定义Logo图标 效果图 实现步骤 定位资源文件夹:首先,您需要定位到 allure/plugins/custom-logo-plugin/static 文件夹.这个文件夹通常 ...
- WPF .Net Core 3.1遇到Satellite Assemblies无法正常加载的处理
1.原因 加载的时候没有调取 AssemblyLoadContext.Default 2.解决方案: 在程序启动的时候,手动调用 /// <summary> /// Interaction ...
- redis - [05] Java & Redis
题记部分 一.准备工作 下载jedis.jar或者在maven配置文件中配置jar包依赖 二.连接redis import redis.clients.jedis.Jedis; public clas ...
- 机器学习 | 强化学习(5) | 价值函数拟合(Value Function Approximation)
价值函数拟合(Value Function Approximation) 导论(Introduction) 目前的价值函数都是基于打表法(lookup table)进行穷举 对于所有状态\(s\)都有 ...
- 【C#语法糖 Lambda】2 - 表达式树与LINQ
一.声明 曾经遇到一个这样的场景: GetEntities(a => a.OrderKindCodeId == 16 && a.IsDeleted, this.DefaultCo ...
- Kubernetes身份认证资源 —— TokenReview详解
1.概述 Kubernetes 中的 TokenReview 是用于验证令牌(Token)有效性的一种 API 资源,属于 authentication.k8s.io/v1 API 组.它允许客户端通 ...