二分查找

二分查找

孤者浪人 提交于 2021-02-12 15:41:30
#include <iostream> using namespace std; int binarySearch(int a[],int n,int key) { int low,high,mid; low = 0; high = n-1; while(low <= high) //记得这个等号... { mid = (low + high)/2; if (key < a[mid]) high = mid - 1; else if (key > a[mid]) low = mid + 1; else return mid; } } int main(int argc, char const *argv[]) { int a[] = {1,1,2,3,5,7,9}; int pos = binarySearch(a,sizeof(a)/sizeof(int),5); cout << pos; return 0; } 来源: oschina 链接: https://my.oschina.net/u/857259/blog/86160

查找

雨燕双飞 提交于 2020-04-05 15:02:02
1.线性查找 2. 二分查找:自定义的 和系统自带的  系统自带的:lower_bound 返回大于或等于目标值的第一个位置。        upper_bound 返回大于目标值的第一个位置。        来源: https://www.cnblogs.com/juanzhi/p/12636321.html

二分查找

别来无恙 提交于 2020-03-31 08:44:09
非递归方法 //二分查找法,在有序的数组中,查找target //如果找到了target,返回相应的索引index template<typename T> int binarySearch(T arr[],int n,T target){ int l=0,r=n-1; while (l<=r) { // int mid = (l+r)/2; int mid = l +(r-l)/2; //避免溢出的问题 if(arr[mid] == target) return mid; //在arr[l...mid-1]之中查找target if(target<arr[mid]) r=mid-1; else l=mid+1; } return -1; } 来源: https://www.cnblogs.com/Erick-L/p/12602837.html

二分查找

喜夏-厌秋 提交于 2020-03-27 07:02:31
二分查找 1、顺序存储结构 2、元素有序 二分查找非递归-Java 实现 //二分查找非递归实现 public class BinarySearch { public static int BinSearch(int a[],int key){ int n = a.length; int low=0,high=n-1,mid; while(low<=high){ mid = (low+high)/2; if(key==a[mid]){ return mid; //查找成功,返回key所在下标 }else if(key<a[mid]){ high = mid -1; }else{ low = mid + 1; } } return -1; //查找失败 } public static void main(String[] args) { int a[]={2,4,7,18,25,34,56,68,89}; int key = 68; int index = BinarySearch.BinSearch(a, key); System.out.println("要查找元素的下标为(如下标为-1,则查找失败):"+index); } } 二分查找非递归-C++ 实现 //二分查找非递归算法 #include <iostream> using namespace std; //二分查找算法

二分查找

独自空忆成欢 提交于 2020-03-25 07:36:38
二分查找 使用PHP描述顺序查找和二分查找(也叫做折半查找) 自定义区间二分查找 function bin_sch($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k) { return $mid; }elseif ($k < $array[$mid]) { return bin_sch($array, $low, $mid-1, $k); }else{ return bin_sch($array, $mid+1, $high, $k); } } return -1; } 全区间二分查找 function getNum($num, $arr) { $length = count($arr); $start = 0; $end = $length - 1; while ($start <= $end) { $middle = floor(($start + $end) / 2); echo 'start = '.$start.' and end = '.$end.' middle = '.$middle."\n"; sleep(1); if ($arr[$middle] == $num) { return $middle; } if (

某科学的二分查找

巧了我就是萌 提交于 2020-03-22 13:07:15
最近学了一点二分查找,虽然算法难度不是很大,但是在noip中还是比较重要的. 接下来是我对查找算法的思考.(若有疏漏之处,敬请指出) 1.查找方式有两种:   (1)线性查找:什么意思呢?就是暴力的用for循环去扫整个数组,枚举就完事儿了。   (2)二分查找:利用中间节点mid进行标记,dio就完事儿了。 2.对于二分查找的一点引入:   猜数字的游戏全世界都玩过吧,给定一个范围,告诉大了还是小了,猜数字。   这是一个很简单也很经典的题目,也是二分的一个体现,这道题目的最佳策略很明显,折半思考就好了。   接下来举一个芒果(为什么是芒果?因为栗子不好吃):   一个数n,在0-100之间:   这里假定n = 33   Q:50!   A:大了!   Q:25!   A:小了!   用了两次机会便将范围缩小到25-50,以此类推即可。   很快就能才出来,如果没明白或者想玩的,自己写一段rand试试看。 3.二分查找的懒汉写法:   (1)binary_search():     a.作用:查找数组中有没有n,有就返回true,没有就返回false。     b.使用方法:binary_search(数组名,数组名+数组长度,查找的数n)   (2)lower_bound():     a.作用:查找数组中第一个大于等于n的值     b,使用方法:lower_bound

Java二分查找

偶尔善良 提交于 2020-03-19 16:45:31
相关代码 二分法查找 //二分查找(折半查找) //要求数组是个有序数组 public class BinarySearch { public static void main(String[] args) { int[] arr={1,2,5,7,8,9,10,10,18,20}; int left=0; int right=arr.length-1; int res=binarySearch(arr, 10,right,left); if(res==-1){ System.out.println("没找到!"); }else{ System.out.println("找到了,下标是"+res); } } public static int binarySearch(int[] arr,int value,int right,int left){ if(right return -1; } int mid=(right+left)/2; if(arr[mid]>value){ return binarySearch(arr,value,mid-1,left); }else if(arr[mid] return binarySearch(arr,value,right,mid+1); }else{ return mid; } } } 这个数组第6位是10,第7位也是10

Java二分查找

一曲冷凌霜 提交于 2020-03-19 16:45:10
相关代码 二分法查找 //二分查找(折半查找) //要求数组是个有序数组 public class BinarySearch { public static void main(String[] args) { int[] arr={1,2,5,7,8,9,10,10,18,20}; int left=0; int right=arr.length-1; int res=binarySearch(arr, 10,right,left); if(res==-1){ System.out.println("没找到!"); }else{ System.out.println("找到了,下标是"+res); } } public static int binarySearch(int[] arr,int value,int right,int left){ if(right return -1; } int mid=(right+left)/2; if(arr[mid]>value){ return binarySearch(arr,value,mid-1,left); }else if(arr[mid] return binarySearch(arr,value,right,mid+1); }else{ return mid; } } } 这个数组第6位是10,第7位也是10

二分查找

我的梦境 提交于 2020-03-14 01:52:32
二分查找 二分查找的前提 目标函数单调性(单调递增或者递减) 存在上下界(bounded) 能够通过索引访问(index accessible) 代码模块 left, right = 0, len(array) - 1 while left <= right: mid = (left + right) / 2 if array[mid] == target: # find the target!! break or return result elif array[mid] < target: left = mid + 1 else: right = mid - 1 在递增数组里 [10,14,19,26,27,31,33,35,42,44] 查找:31 10,14,19,26,27,31,33,35,42,44 0 1 2 3 4 5 6 7 8 9 取中间4 往后5~9取7 5~7取6 5~6取5得出最终结果 x的平方根 //二分法 class Solution { public: int mySqrt(int x) { long long i=0; long long j=x/2+1; while(i<=j) { long long mid=(i+j)/2; long long res=mid*mid; if(res==x) return mid; else if(res<x

二分查找(D. Pair of Topics)

放肆的年华 提交于 2020-03-13 02:15:12
题意:给出两组长度为n的数组ai,bi。问满足(i < j) ai + aj > bi + bj 有多少对? 解法:变形ai-bi + aj - bj > 0 ,记数组ci = ai-bi .可知该题就是统计ci+cj > 0 有多少对。 对数组ci排序,对于ci贡献 等于 在ci后面找 大于 -ci 有多少个数。因为有序,直接upper_bound()找。 时间复杂度为(nlogn)。 //#include<bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <string> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> typedef long long ll ; #define int ll #define mod 1000000007 #define gcd __gcd #define rep(i , j , n) for(int i = j ; i <= n ; i++) #define red