“仅有10%的专业程序员能把这个小程序写的完全正确”
MPU 2002-11-16 04:36:39 《程序设计语言5:概念和机构》 裘宗燕 译
书中的一段原话:
例3.4 Bently【1986】要求超过100个专业程序员把下面这段有关二分法的简要描述“写成一个程序,语言由他们自己选择.............
他报告说,“我感到非常惊讶,给了他们充足的时间,仅有10%的专业程序员能把这个小程序写的完全正确”。
我们要确定在一个已经排好序的数组X[1...N]中是否包含元素T。二分法解决问题的方法是维持数组中可能包含T的区域的踪迹(如果元素T确实在数组中的某处)。在开始的区域就是整个数组,通过将元素T与数组的中间元素比较可以缩小范围,丢掉数组的一半。这个过程一直继续T被找到,或者是T可能存在的范围变空。
Berntley提出了如下建议:“绝大多数程序员都认为,只要手头上有了上面这段有
关二分法的描述,写出代码是一件很容易得事。然而他们错了。如果你现在就把这篇文章放在一边,亲自动手写代码试一试。你就会相信这一点。”
我是初学者在“亲自动手写代码试一试”之后我深深的“相信这一点”
在《C++ Primer》中找到一个二分查找的函数:
但我觉得它不“完全正确”。
非完全二分查找,有没有高手帮我写一个。。
谢了!!!!!!!!!!
#include<iostream>
#include<vector>
using namespace std;
int Numsear(vector<int>vec ,int val);
const int notfound = -1;
int main(int argc, char *argv[])
{
vector<int>num(50);
int value;
int size;
cout<<"Enter to size: "<<endl;
cin>>size;
cout<<"Enter to value: "<<endl;
cin>>value;
for(int n=0; n<size; ++n)
{
num[n] = n;
//cout<<num[n]<<endl;
}
if( Numsear(num,value) < 0 )
{
cout<<"The number notfound!"<<endl;
}
else
{
cout<<"The number found!"<<endl;
cout<<Numsear(num,value)<<endl;
}
return 0;
}
////////////////////////////////////////////////////
int Numsear(vector<int>vec,int val)
{
int low =0;
int high = vec.size() - 1;
while( low <= high )
{
int mid = ( low + high ) /2;
if( val == vec[mid] )
return mid;
if( val < vec[mid] )
{
high = mid -1;
}
else {
low = mid + 1;
}
}
return notfound;
}