分治算法——二分查找(返回下标)

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--二分查找的更多相关文章

  1. PHP-----二维数组和二分查找

    二维数组由行和列组成.由arr[$i][$j]表示,先后表示行和列,类似于坐标点. 打印二维数组-----通过两次遍历,第一次遍历每一行,第二次遍历每一行的具体元素,并且通过使用count($arr[ ...

  2. java 13-1 数组高级二分查找

    查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...

  3. Java数据结构和算法总结-数组、二分查找

    前言:在平时开发中数组几乎是最基本也是最常用的数据类型,相比链表.二叉树等又简单很多,所以在学习数据和算法时用数组来作为一个起点再合适不过了.本篇博文的所有代码已上传 github ,对应工程的 ar ...

  4. [c/c++] programming之路(15)、多维数组和二分查找法,小外挂

    一.多维数组 #include<stdio.h> #include<stdlib.h> void main(){ ][]; int i,j; ; i < ; i++) { ...

  5. [算法][LeetCode]Search a 2D Matrix——二维数组的二分查找

    题目要求 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...

  6. [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找

    一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...

  7. 【大视野入门OJ】1083:数组的二分查找

    Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output ...

  8. Java数组之二分查找

    简单的二分查找 package com.kangkang.array; public class demo03 { public static void main(String[] args) { / ...

  9. leetcode:Search for a Range(数组,二分查找)

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  10. 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 ...

随机推荐

  1. runoob-pandas(python)

    https://www.runoob.com/pandas/pandas-tutorial.html Pandas 教程 Pandas 是 Python 语言的一个扩展程序库,用于数据分析. Pand ...

  2. bat脚本(批处理程序)调用WinRAR及7zip压缩和解压缩

    最近项目要用到定期批量将文件及文件夹下的文档打包,所以想到要写脚本来实现,然后做Windows定期任务调用.bat脚本(批处理程序)调用WinRAR及7zip压缩和解压缩. 调用WinRAR来实现 因 ...

  3. c代码部分封装为lib

    需求:将一个C工程中的核心代码封装为静态文件:lib. 环境 工具:VC6.0++ 语言:c 以封装一个DES工程为例 封装 (1)新建一个静态工程 (2)新建c文件和h文件 (3)挑选封装内容 在原 ...

  4. 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

    九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) @ 目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 1. RDB 概述 ...

  5. 定制Allure报告

    定制Allure报告 自定义Logo图标 效果图 实现步骤 定位资源文件夹:首先,您需要定位到 allure/plugins/custom-logo-plugin/static 文件夹.这个文件夹通常 ...

  6. WPF .Net Core 3.1遇到Satellite Assemblies无法正常加载的处理

    1.原因 加载的时候没有调取 AssemblyLoadContext.Default 2.解决方案: 在程序启动的时候,手动调用 /// <summary> /// Interaction ...

  7. redis - [05] Java & Redis

    题记部分 一.准备工作 下载jedis.jar或者在maven配置文件中配置jar包依赖 二.连接redis import redis.clients.jedis.Jedis; public clas ...

  8. 机器学习 | 强化学习(5) | 价值函数拟合(Value Function Approximation)

    价值函数拟合(Value Function Approximation) 导论(Introduction) 目前的价值函数都是基于打表法(lookup table)进行穷举 对于所有状态\(s\)都有 ...

  9. 【C#语法糖 Lambda】2 - 表达式树与LINQ

    一.声明 曾经遇到一个这样的场景: GetEntities(a => a.OrderKindCodeId == 16 && a.IsDeleted, this.DefaultCo ...

  10. Kubernetes身份认证资源 —— TokenReview详解

    1.概述 Kubernetes 中的 TokenReview 是用于验证令牌(Token)有效性的一种 API 资源,属于 authentication.k8s.io/v1 API 组.它允许客户端通 ...