二分查找

来源:互联网 发布:福建省应急管理网络 编辑:程序博客网 时间:2024/06/05 14:47
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
测试样例:
[1,3,5,7,9],5,3
返回:1
此方法利用递归的方式,运行是在牛客网上,因为牛客网是连续输入,例如静态变量在一个案例返回的时候必须重新设置为0,否则会出现错误,导致下一个案例仍然在上一个案例的基础上继续使用
#include #include using namespace std;int getPos(vector A, int n, int val) {// write code herestatic int count = 0;int m = A[n / 2];if (n == 1 && m != val){int ttt = count;count = 0;return -1;}else{vector front, back;if (m == val){if (n == 1){int ttt = count;count = 0;return n / 2 + ttt;}else{front.insert(front.begin(), A.begin(), A.begin() + n / 2);for (int i = front.size() - 1;i >= 0;i--){if (front[i] != m){int ttt = count;count = 0;return n / 2 + ttt - front.size() + i + 1;}if (i == 0){int ttt = count;count = 0;return n / 2 + ttt - front.size() + i;}}return 0;}}else{if (m>val){front.insert(front.begin(), A.begin(), A.begin() + n / 2 );return getPos(front, n / 2, val);}else{if (n == 2){int ttt = count;count = 0;return -1;}else{back.insert(back.begin(), A.begin() + n / 2 + 1, A.end());count = count + n / 2 + 1;return getPos(back, (n - 1) / 2, val);}}}}}int main(){vector A;int n = 5;int val = 3;A.push_back(7);A.push_back(21);A.push_back(21);A.push_back(21);A.push_back(28);A.push_back(35);A.push_back(38);cout << getPos(A, 7,38) << endl;cout << getPos(A, 7, 38) << endl;getchar();getchar();return 0;}
原创粉丝点击