1. 程式人生 > >《程式設計珠璣》程式碼之路7:這演算法全世界程式設計師16年才寫對,你肯定想不到竟然是這個

《程式設計珠璣》程式碼之路7:這演算法全世界程式設計師16年才寫對,你肯定想不到竟然是這個

這篇部落格要講的演算法,是個有故事的演算法,大家一定會喜歡的:

有這麼一個演算法:

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;
}