二分查找
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
测试样例:
[1,3,5,7,9],5,3
返回:1
// 二分查找.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <vector>
using namespace::std;
class BinarySearch {
public:
int getPos(vector<int> vec, int n, int val) {
// write code here
if (vec.empty() == true || n <= 0) return -1;
int first = 0;
int last = vec.size() - 1;
int mid = n / 2;
while (first <= last) {
if (vec[mid] < val) {
first = mid + 1;
mid = (first + last) / 2;
}
else if (vec[mid] > val) {
last = mid - 1;
mid = (first + last) / 2;
}
else {
return mid;
}
}
return -1;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int arr[] = { 1, 3, 5, 7, 9 };
vector<int> test(arr, arr + 5);
BinarySearch obj;
int result = obj.getPos(test, 5, 3);
return 0;
}
第二次做:
class BinarySearch {
public:
int getPos(vector<int> vec, int n, int val) {
// write code here
if ( vec.empty() == true ) return -1 ;
int first = 0 ;
int last = vec.size() - 1 ;
while ( first - last <= 0 ) {
int mid = ( first + last ) / 2 ;
if ( val < vec[mid] ) {
last = mid - 1 ;
} else if ( val > vec[mid] ) {
first = mid + 1 ;
} else {
if ( mid - 1 >= 0 && vec[mid - 1 ] == val ) return mid - 1 ;
else return mid ;
}
}
return -1 ;
}
};