二分查找-数组实现(小trick)

template<typename T>
int binarySearch(T arr[], int n, T target){
    int l = 0, r = n-1;          //在[l...r]范围内寻找targetwhile(l <= r){              //当 l == r 时 区间有效
    int mid = l+(r-l)/2;
    if(arr[mid] == target)
        return mid;
    if(target > arr[mid])
        l = mid + 1;          //target在[mid+1, r]中
    else                 //target<arr[mid]
        r = mid - 1;          //target在[l...mid]中
}

此处的需要注意的点是:

为什么不用 int mid = (l+r)/2

因为mid,l,r 都是整型,所以如果l,r过大,相加后容易整型溢出,所以使用

int mid = l+(r-l)/2

先相减再加的方法。

原文地址:https://www.cnblogs.com/Bella2017/p/10088639.html

时间: 2024-11-08 09:27:10

二分查找-数组实现(小trick)的相关文章

二分查找 数组的二分查找

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 1083: 数组的二分查找 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1646  Solved: 641[Submit][Status][Web Board] Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output 一个整数(表示x的位置,若

二分查找数组去重

先定义一个数组 var arr = [1,2,3,3,4,5,9,3,0,8,6,5,7]; function finaInArr(arr,n){ //使用finaInArr()方法,里面传两个参数,arr:实现去重的数组,n:数组里的每个数 for (var i=0;i<arr.length;i++) { if(arr[i]==n)return true; //判断数组里的每个数,若数组里有就返回true,没有就返回false } return false; } function remove

二分查找数组中与目标数字(可以是浮点型)最近的数的位置

0 ///欢迎批评指正 1 #include <stdio.h> 2 3 int a[100]; 4 5 int search(int start,int end,double distinction){ 6 int mid; 7 if(distinction > a[end - 1]) 8 return end - 1; 9 if(distinction < a[start]) 10 return start; 11 while(1){ 12 mid = (start + end

leetcode 刷题之路 70 earch Insert Position 二分查找插入位置

Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You may assume no duplicates in the array. Here are few examples. [1,3,5,6], 5 → 2 [1,3,5,6], 2

二分查找之新手篇——函数使用

首先介绍c++万能头文件 #include<bits/stdc++.h> using namespace std;(比较适合偷懒,但是不能确保不会出错)(用还是可以的,粗错了再回头来改嘛) 接下来介绍一下两个二分查找函数: upper_bound()与lower_bound(): ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法(函数)返回一个非递减序列[first, last)中

PHP算法之二分查找

二分查找: 数组必须有序,且不重复. 一般实际工作中,很少有这样的数组,所以应用的很少,但是思想很好. 1 // 二分查找 2 $array = [10,14,23,33,45,56,65,77,89,99,102]; 3 $find = 56; 4 5 function search($array,$find) 6 { 7 $end = count($array)-1; //求出最大的数组个数,并以此为结束 8 $start = 0 ; //以0开始 9 $mid = floor(($end

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

一.多维数组 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main(){ 5 int num[3][4]; 6 int i,j; 7 for (i = 0; i < 3; i++) 8 { 9 for (j = 0; j < 4; j++) 10 { 11 num[i][j]=4*i+j+1; 12 printf("%-3d",num[i][j]); 13 } 14 printf("\

二分——无序数组快速查找第K小的数

#1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久,决定随机选择一个k,然后拆掉稀有度第k小的船. 已知每一艘船都有自己的稀有度,Nettle现在把所有

关于数组的几个小题目-冒泡排序、二分查找、直接选择排序、反转数组

1. 实现冒泡排序算法,对比相邻元素,如果满足条件就叫唤元素值,把较小的元素移动到数组前面,把较大的元素移动到数组的后面,这样较小的元素就逐渐从底部上升到顶部,排到前面了. public class zuoye14_maopaopaixu { public static void main(String[] args){ int[] array = new int[]{12,45,21,35,65,24,43}; for(int i=0;i<array.length;i++){ for(int