二分法查找. BinarySearch

引言

 

前几天参加2014阿里巴巴春季校招(测试开发岗)笔试, 里面有一道改错题, 就是给了一个binary_search的代码. 结果这么基础的一题我还是没能答全对. 悲剧悲剧, 这个水平注定去不了阿里…现在开始亡羊补牢.

 

二分查找

 

算法: binarySearch

输入: 数组a, 起始索引begin, 结束索引end, 所查找值value

输出: 若找到则返回value在a中索引, 否则返回-1.

 

测试用例

 

后面两个版本的二分法都能通过以下用例:

 0. a == NULL
 1. 边界值, 即begin和end
 2. 最后会剩两个数min, max. 查找key, key == min
 3. 最后会剩两个数min, max. 查找max, key == max
 4. 最后会剩两个数min, max. 查找key, key < min
 5. 最后会剩两个数min, max. 查找key, min < key < max
 6. 最后会剩两个数min, max. 查找key, key > max

如果有高人发现不能通过的用例还求不吝赐教. 跪谢.

 

算法binarySearch

 

自己先写一个:

int binarySearch(int* a, int begin, int end, int value){
	if(!a) return -1;

	int min = begin;
	int max = end;
	int middle;

	while(min <= max){
		middle = min + (max - min) / 2; //防止溢出,不写成mid = (max+min)/2

		if(a[middle] == value)
			return middle;
		else if(a[middle] < value){
			min = middle + 1;
		} else {
			max = middle - 1;
		}
	}

	return -1;
}

编程之美版binarySearchBoP

int binarySearchBoP(int* arr, int begin, int end, int val){
	if(NULL == arr)
		return -1;

	int minIndex = begin;
	int maxIndex = end;
	int middleIndex;

	while(minIndex < maxIndex - 1){
		middleIndex = minIndex + (maxIndex - minIndex)/2; //防止溢出,不写成mid = (max+min)/2
		if(arr[middleIndex] <= val){
			minIndex = middleIndex;
		} else {
			maxIndex = middleIndex;
		}
	}

	if(arr[minIndex] == val){
		return minIndex;
	} else if(arr[maxIndex] == val){
		return maxIndex;
	} else {
		return -1;
	}
}

完整程序

#include <iostream>
#include <cstdlib>
using namespace std;

typedef int (*BSFuncPointer)(int*, int, int,  int);

int binarySearch(int* a, int begin, int end, int value){
	if(!a) return -1;

	int min = begin;
	int max = end;
	int middle;

	while(min <= max){
		middle = min + (max - min) / 2;

		if(a[middle] == value)
			return middle;
		else if(a[middle] < value){
			min = middle + 1;
		} else {
			max = middle - 1;
		}
	}

	return -1;
}

int binarySearchBoP(int* arr, int begin, int end, int val){
	if(NULL == arr)
		return -1;

	int minIndex = begin;
	int maxIndex = end;
	int middleIndex;

	while(minIndex < maxIndex - 1){
		middleIndex = minIndex + (maxIndex - minIndex)/2;
		if(arr[middleIndex] <= val){
			minIndex = middleIndex;
		} else {
			maxIndex = middleIndex;
		}
	}

	if(arr[minIndex] == val){
		return minIndex;
	} else if(arr[maxIndex] == val){
		return maxIndex;
	} else {
		return -1;
	}
}

void test_binarySearch(BSFuncPointer binarySearch, int* a, int length, int value, int expectedResult){
	if (binarySearch(a, 0, length-1, value) == expectedResult){
		cout << "Test passed!" << endl;
	} else {
		cout << "Test failed with parameters[a, length, value, expectedResult]: " 
			<< a << ',' 
			<< length << ',' 
			<< value << ',' 
			<< expectedResult << endl; 
	}
}

void test(BSFuncPointer func, const char* funcName, int* arr, int length){
	cout << "Test func: " << funcName << endl;
	
	// case0
	test_binarySearch(func, NULL, length, 0, -1); 

	// case1
	test_binarySearch(func, arr, length, 1, 0); 
	test_binarySearch(func, arr, length, 21, 10); 

	// case2
	test_binarySearch(func, arr, length, 7, 3);

	// case3
	test_binarySearch(func, arr, length, 3, 1); 

	// case4
	test_binarySearch(func, arr, length, 0, -1); 

	// case5
	test_binarySearch(func, arr, length, 2, -1); 

	// case6
	test_binarySearch(func, arr, length, 4, -1); 

}

int main(){
	int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21}; // 11个元素
	int length = sizeof(arr) / sizeof(int);

	test(binarySearch, "binarySearch", arr, length);
	test(binarySearchBoP, "binarySearchBoP", arr, length);

	system("pause");
	return 0;
}

 

 

点赞