《数组》--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 ...
随机推荐
- HBase介绍和工作原理
HBase 1.HBase介绍和工作原理 HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigtable:一个结构化数据的分布式存 ...
- MySQL如果数据存在则更新,不存在则插入
如果数据存在则更新,不存在则插入,MySQL有duplicate.replace into.replace三种方式如何更新数据? insert ignore into 又是如何插入数据的呢? 准备表和 ...
- Java版的对象关系映射实现
在前面的几篇文章中,实现了获得基本类型的默认值,基本数据类型的转换等,主要的目标就是实现一个Java版的对象关系映射程序. 思路如下: 1: 对象必须是一个Java Bean. 2: 遍历对象的所有以 ...
- Linux开发帮助参考
在开发Linux系统下面软件时常常需要查阅手册,但是如果你的开发平台不是Linux系统,那你无法丝滑使用man手册,这里推荐一些方便的Linux开发手册. 手册: 在线man手册:Linux Man ...
- 0424-字节输出流FileOutputStream
package A10_IOStream; import java.io.FileOutputStream; import java.io.IOException; import java.util. ...
- Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
Brainfuck 简介 Brainfuck 是由 Urban Müller 在 1993 年创造的一门非常精简的图灵完备的编程语言. 正所谓大道至简,这门编程语言简单到语法只有 8 个字符,每一个字 ...
- initiator 连接target
客户端 检查是否发现 [root@kvm1 ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.114.14 1 ...
- autMan奥特曼机器人-自建autMan插件市场
一.自建市场配置 配置参数 二.上架设置 设置哪些插件上架,哪些不上架 三.检测是否成功 怎样检查是否成功了?订阅一下自己,然后看应用市场上是否显示 四.用户怎样购买插件 用户想买自建市场作者的插件, ...
- Typecho实现版权声明的三种方式
在安装完Typecho之后,第一件事应该就是想着如何去折腾了.对于个人博客而言,不希望自己辛辛苦苦写的文章,被别人转载或无脑采集,还不留原地址,所以就需要在文章的末尾地方放上一个版权声明,来提醒下转载 ...
- C++17 Filesystem 实用教程
点击查看代码 C++17 标准带来了 std::filesystem库, 提供了强大的工具来处理文件路径, 目录以及其他与文件系统相关的操作. 这篇文章适合 C++ 初学者以及希望掌握 C++17 新 ...