function erfenfa(\$a,\$value,\$star,\$end)
{

``````    if ( \$star > \$end )
{
return "数据 \$value 不在范围内";
}

echo "开始从 \$star - \$end 之间寻找 <br>";
\$middle = floor( (\$star+\$end)/2 );
\$middle_value = \$a[\$middle];

if ( \$value == \$middle_value )
{
return true;
}

elseif ( \$value > \$middle_value ) //从左边找
{
\$end = \$middle-1;
erfenfa(\$a,\$value,\$star,\$end);
}

elseif ( \$value < \$middle_value ) //从右边找
{
\$star = \$middle+1;
erfenfa(\$a,\$value,\$star,\$end);
}
}

\$length = count(\$a);
\$star = 0;
\$end = \$length-1;
\$value = 50;

echo "用二分法查找 \$value <br>";
\$s = erfenfa(\$a,\$value,\$star,\$end);
var_dump(\$s);
``````

6个回答

ldq777888 没问题，从大到小降序
2 年多之前 回复

ldq777888 这是php谢谢，不懂请百度
2 年多之前 回复

Java 二分法查找最值问题。

java容器中的二分法查找

#include <stdio.h> int binary_search_recursive(int arr[], int left, int right, int query); int main () { int arr[10]; int left, right, query; int i , res_r; printf ("请输入数据："); for (i = 0; i <= 9; i++) scanf ("%d" , &arr[i]); printf ("输入区间："); scanf ("%d%d" , &left , &right); printf ("输入要查找的数据："); scanf ("%d" , &query); res_r = binary_search_recursive(arr , left , right , query); printf ("%d\n" , res_r); return 0; } int binary_search_recursive(int arr[], int left, int right, int query) { int low = left , high = right , mid; int flag = 0; mid = (low + high) / 2; if (low > high) flag = -1; if (query == arr[mid]) flag = 1; if (arr[mid] > query) binary_search_recursive(arr , low , mid - 1 , query); else binary_search_recursive(arr , mid + 1 , high , query); if (flag == 1) return mid; if (flag == -1) return -1; }
Matlab二分法，总是出现错误，各位大神请赐教！
``` %二分法 function [xstar,index,it]=bisect(fun,a,b,ep) if nargin<4 ep=0.00001; end fa=feval(fun,a);fb=feval(fun,b); if fa*fb>0 xstar=[fa,fb];index=0;it=0; return end k=0; while abs(b-a)/2>=ep x=(a+b)/2; fx=feval(fun,x); if fx*fa<0 b=x;fb=fx; else a=x;fa=fx; end k=k+1; end xstar=(a+b)/2;index=1;it=k; end function f=fun2(x) f=exp(x)+10*x-2; [xstar,index,it]=bisect('fun2',0,1,0.001); end ``` 出错：>> fun2(1) Maximum recursion limit of 1000 reached. Use set(0,'RecursionLimit',N) to change the limit. Be aware that exceeding your available stack space can crash MATLAB and/or your computer. Error in bisect

#include<stdio.h> int main() { int a[6]; int i,c; int low=0; int high=5; int mid; for(i=0;i<6;i++) scanf("%d",&a[i]); scanf("%d",c); for(i=0;i<6;i++) { mid=(high+low)/2; if(c==a[mid]) printf("%d",mid); if(c>a[mid]) low=mid+1; if(c<a[mid]) high=mid-1; } if(c!=a[mid]) printf("sorry"); } 若找到输出：数所在的下标，否则输出sorry 如何修改

python：用递归方法编写二分法查找函数 程序报错

leetcode53，二分法，为什么会超过时间限制？
``` class Solution { public: int maxSubArray(vector<int>& nums) { return divide(nums, 0, nums.size()-1); } private: int divide(vector<int> &nums,int l,int r){ if(l >= r) return nums[l]; int mid = (l + r) / 2; int lmax = divide(nums,l,mid - 1); int rmax = divide(nums,mid + 1,r); int mid_l = nums[mid]; //计算左边最大的串 for(int i = mid - 1 ,sum = nums[mid];i >= l ;--i){ sum += nums[i]; mid_l = max(sum , mid_l); } //与右边的合并 int mid_r = mid_l; for(int i = mid +1 ,sum = mid_r;i <= r;++r){ sum += nums[i]; mid_r = max(sum,mid_r); } return max(lmax,max(rmax,mid_r)); } }; ``` 基本上就是抄写的[这里的二分法](https://blog.csdn.net/yaoct/article/details/80352854 "")，但是却会超过时间限制，请问为什么呢？

``` class fun{ // TODO Auto-generated method stub public static void Bisektion() { float ymiddle = (float)0.0; float yleft = (float)0.0; float yright = (float)0.0; float a = 0; float b = (float)3; for(int i = 0;i <=10000;i++) { float c = (float)((a+b)/2); float x = c; ymiddle =(float) Math.pow(x, 3)-3*x-3; // 带入C， C 居于方程的中间 yleft =(float) Math.pow(a, 3)-3*a-3; yright =(float) Math.pow(b, 3)-3*b-3; if (ymiddle*yleft>0) { a = c; if(i==10000) { System.out.println("Die Resultat:"+c); } }else { b = c; if(i==10000) { System.out.println("Die Resultat:"+c); } } } } } public class Bisektionsverfahren { public static void main(String[] args) { fun.Bisektion(); } } ``` 上面是我写的程序，但是有一个东西完全没有思路，就是如何设置这个循环，尽可能达到double或者float值的极限呢？也就是能达到的最精确的值。

def half_seek(point, seqence): a = len(readsx) b = a/2 if point <= readsx[b]: c = readsx[:b + 1] a = len(c) b = a/2 if point <= c[b]: c = c[:b + 1] a = len(c) b = a/2 else: c = c[b:] a = len(c) b = a/2 if point <= c[b]: c = c[:b + 1] a = len(c) b = a/2 else: c = c[b:] a = len(c) b = a/2 if point <= c[b]: else: c = readsx[b:] a = len(c) b = a/2 if point <= c[b]: c = c[:b + 1] a = len(c) b = a/2 else: c = c[b:] a = len(c) b = a/2 if point <= c[b]: c = c[:b + 1] a = len(c) b = a/2 格式不对。。。。。我就不粘贴了。。。。怎么写个循环呢？ 我是想写个函数以后用，目的是给一个值，给了一个由小到大的数列list形式，确定这个给的数能排哪个位置？
python二分法，请大神帮忙看看这个输出，求解释。非常捉急~
def search2(a,m): low = 0 high = len(a) - 1 while low<=high: mid = (low + high)/2 midval = a[mid] if midval<m: low = mid + 1 elif midval>m: high = mid-1 else: print mid return mid print -1 return -1 这是我在网上粘的别人写的，我不懂为什么最后两行会print和return的是-1？？？不管if,elif,else,讨论完了都该返回查找结果啊，就是这个数在哪不是吗
C语言 二分法求多项式单根 程序通不过oj的测试
![图片说明](https://img-ask.csdn.net/upload/201908/11/1565533167_367875.png) 以下面的程序运行，oj的4个测试点只能通过两个，程序有什么没考虑到的情况吗？ #include <stdio.h> #include <math.h> int a3,a2,a1,a0; double f(double x) { double func; func = a3*pow(x,3.0)+a2*pow(x,2.0)+a1*x+a0; return func; } int main() { double a,b,mid; scanf("%d %d %d %d\n%lf %lf",&a3,&a2,&a1,&a0,&a,&b); while (b-a>=0.01) { mid =(a+b)/2; if (f(mid)==0.0) { goto out; } else if (f(mid)*f(a)>0) { a=mid; } else if (f(mid)*f(b)>0) { b=mid; } } mid = (a+b)/2; out: printf("%.2f", mid); return 0; }

``` public class DateSort{ public static void main(String[] args){ Dates days[] = new Dates[10]; days[0] = new Dates(2013,3,1); // 初始化日期数组，任意赋值 days[1] = new Dates(2014,3,1); days[2] = new Dates(2013,4,5); days[3] = new Dates(2014,5,28); days[4] = new Dates(2012,8,9); days[5] = new Dates(2001,12,11); days[6] = new Dates(2005,10,10); days[7] = new Dates(2008,8,8); days[8] = new Dates(2015,9,29); days[9] = new Dates(1992,1,1); Dates day = new Dates(2015,9,29); System.out.println("未排序"); for(int i = 0;i<10;i++){ //输出数组，未排序 days[i].display(); } for(int i = 0;i < days.length;i++){ for(int j = i+1;j < days.length;j++){ if(days[i].compare(days[j]) == -1){ Dates d = days[i]; days[i] = days[j]; days[j] = d; } } } System.out.println("\n排序以后"); for(int i = 0;i<10;i++){ //排好序，输出数组 days[i].display(); } //二分法查找特定Day int start = 0; int end = days.length-1; int m = (start+end)/2; while(start<=end){ if(days[m].compare(day) == 0){ System.out.println("找到了与day相同的日期，下标i为：" + m); break; } if(days[m].compare(day) == 1){ end = m-1; } if(days[m].compare(day) == -1){ start = m+1; } m = (start+end)/2; if(start == end && days[m].compare(day) != 0) System.out.println("No Found"); } } } class Dates{ int year,month,day; Dates(int y,int m,int d){ year = y; month = m; day = d; } public int compare(Dates date){ return year > date.year ? 1 :year < date.year ? -1 :month > date.month ? 1 :month < date.month ? -1 :day > date.day ? 1 :day < date.day ? -1 : 0; } public void display(){ System.out.println(year + "-" + month + "-" + day); } } ``` 先new 一个day对象。然后用折半查找法在自定义的Dates数组中查找是否存在相同时间，若存在返回下标，不存在，打印No Found。 问题是：new了一个确实存在与days数组里的day对象。但是运行结果是No Found。 后来尝试着将排序的语句删掉，将原来的Dates数组的值，按顺序赋值。这样运行的结果是没问题的，都能查找到。 所以就不知道问题出在哪儿了！求大神指点一二

C语言怎么用二分法求一元三次方程的根。啊 能不能把程序打出来一下谢了！！！

Java学习的正确打开方式

Python——画一棵漂亮的樱花树（不同种樱花+玫瑰+圣诞树喔）

HashMap 相关概念 HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary，HashMap、TreeMap继承自AbstractMap，三者均实现Map接口 **HashTab：**同步哈希表，不支持null键或值，因为同步导致性能影响，很少被使用 **HashMap：**应用较多的非同步哈希表，支持null键或值，是键值对...

linux系列之常用运维命令整理笔录

Python 基础（一）：入门必备知识

Python十大装B语法
Python 是一种代表简单思想的语言，其语法相对简单，很容易上手。不过，如果就此小视 Python 语法的精妙和深邃，那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点，并附上详细的实例代码。如能在实战中融会贯通、灵活使用，必将使代码更为精炼、高效，同时也会极大提升代码B格，使之看上去更老练，读起来更优雅。 1. for - else 什么？不是 if 和 else 才

2019年11月中国大陆编程语言排行榜
2019年11月2日，我统计了某招聘网站，获得有效程序员招聘数据9万条。针对招聘信息，提取编程语言关键字，并统计如下： 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7

JDK12 Collectors.teeing 你真的需要了解一下

“狗屁不通文章生成器”登顶GitHub热榜，分分钟写出万字形式主义大作

《程序人生》系列-这个程序员只用了20行代码就拿了冠军

11月8日，由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办，科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。 　　区块链技术被认为是继蒸汽机、电力、互联网之后，下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力，电力解决了人类基本的生活需求，互联网彻底改变了信息传递的方式，区块链作为构造信任的技术有重要的价值。 　　1...