这篇博客要讲的算法,是个有故事的算法,大家一定会喜欢的:
有这么一个算法:
1:业界巨佬经典巨著《编程珠玑》的作者,在课堂上给出了思想,不限时间让程序员们实现,所有的程序员在提交的时候都觉得自己写的是对的,然而结果是即使是高级程序员,90%以上的人都写错了。
2:世界史诗级计算机天才、人工智能之父、图灵奖获得者Donald Ervin Knuth,在传说级巨著《计算机程序设计艺术》中提到:有个算法的论文在1946年就发表了,但这个算法第一个没有错误的程序直到1962年才出现。
想必这个算法一定很牛逼吧!!!!
瑟瑟发抖。。。。
瑟瑟发抖。。。。
瑟瑟发抖。。。。
瑟瑟发抖。。。。
瑟瑟发抖。。。。
瑟瑟发抖。。。。
好了,不卖关子了,它的名字叫“二分查找”!!!!!!!!!!!!
好了以上的故事都是真的。
谨以这个故事勉励所有程序员,不要妄自菲薄,随意贬低自己丧失自信。全世界16年,多少天才呀。
无论什么时候,一定要相信自己,努力练习,不断提升自己,永远都是来得及的。不要老觉得自己智商不够。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<int> nums; //存储要搜索数组的vector
int target = 123; //要搜索的目标
// 如果不正常的话反回-1
int BinarySearch(vector<int> &arr, int target);
int main(){
freopen("in.txt", "r", stdin);
int num;
while (scanf("%d", &num) != EOF){
nums.push_back(num);
}
int pos = BinarySearch(nums, target);
if (pos >= 0 && pos < nums.size()){
cout << pos << ' ' << nums[pos] << endl;
}else{
cout << "error" << endl;
}
return 0;
}
int BinarySearch(vector<int> &arr, int target){
int left = 0, right = arr.size() - 1;
while (left <= right){
int mid = (left + right) / 2;
if (arr[mid] == target){
return mid;
}else if (arr[mid] < target){
left = mid + 1;
}else if (arr[mid] > target){
right = mid - 1;
}else{
return -1;
}
}
return -1;
}