我们经常会遇到这样的问题,想要查询一个数据里有没有这个数,一般有几种方法。我总结了一下,有什么不对的,欢迎大佬指出!QAQ
1.循环
#include <iostream> using namespace std; int main() { int q; cin>>q; int a[10]={0,1,2,3,4,5,6,7,8,9}; for(int i=0;i<10;i++) { if(a[i]==q) cout<<"the position is"<<i<<endl; } return 0; }
时间复杂度:O(n);有的耗时间.
2.循环
#include <iostream> #include <vector> using namespace std; int binarySearch(vector<int> &a, int x) { int left = 0, right = a.size() - 1, mid; while (left <= right) { mid = (left + right)>> 1; if (a[mid] < x) left = mid + 1; else if (a[mid] > x) right = mid - 1; else return mid; } return -1; // 查找失败 } int main() { int q=8; vector<int>a1; for(int i=0;i<10;i++) { a1.push_back(i); } cout<<binarySearch(a1,q)<<endl; return 0; }
时间复杂度:O(nlogn)
其实这个是有点小问题。(这里指的是right,left的下标移动问题)
left最终是比right大1;
2.循环1
#include <iostream> #include <vector> using namespace std; int binarySearch(vector<int> &a, int x) { int left = 0, right = n - 1, mid; while (left < right) { mid = (left + right) / 2; if (a[mid] >= x) right = mid; else left = mid + 1; } return a[left] == x ? left : -1; // a[right] == x 也是一样的 } int main() { int q=8; vector<int>a1; for(int i=0;i<10;i++) { a1.push_back(i); } cout<<binarySearch(a1,q)<<endl; return 0; }
这个二分你会发现它循环退出的条件是left=right,
不管q是否查找成功,最终left=right
有点不一样的是,查找失败,会返回left ,right均大于x的最小位置上.
这种其实是找到结果后,不会立马退出循环,时间复杂度依然是O(nlogn)
3.递归
#include <iostream> using namespace std; int binSearch(vector<int> &a, int start, int end1, int q) { int mid = (end1 - start) / 2 + start; if (a[mid] == q) { return mid; } if (start >= end1) { return -1; } else if (q > a[mid]) { return binSearch(a, mid + 1, end1, q); } else if (q <a[mid]) { return binSearch(a, start, mid - 1, q); } return -1; } int main() { int q=9; vector<int>a1; for(int i=0;i<10;i++) { a1.push_back(i); } cout<<binSearch(a1,0,9,q)<<endl; return 0; }
这个是递归版本
思想类似
有任何问题,欢迎斧正!