折半查詢法
阿新 • • 發佈:2021-12-25
折半查詢法
折半查詢法,一種基於分治思想的查詢演算法,對於一串按照從小到大或從大到小順序排列的數字,折半查詢法最壞的時間複雜度為O(logn)。
遞迴折半
檢視程式碼
#include <bits/stdc++.h> using namespace std; int a[10001], key; void search(int l, int r) { int mid; if (r>=l) { mid = (r+l)/2; if (key==a[mid]) { printf("%d", mid); return ; } else if (key<a[mid]) search(l, mid-1); else search(mid+1, r); } else puts("-1"); } int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i ++) scanf("%d", &a[i]); scanf("%d", &key); search(1, n); return 0; }
非遞迴折半
檢視程式碼
#include <bits/stdc++.h> using namespace std; int n, a[10001], key; void search() { int l = 1, r = n; while (l<=r) { int mid = (l+r)/2; if (key==a[mid]) { printf("%d", mid); return ; } else if (key<a[mid]) r = mid-1; else l = mid+1; } puts("-1"); } int main() { scanf("%d", &n); for (int i = 1; i <= n; i ++) scanf("%d", &a[i]); scanf("%d", &key); if (key<a[1] || key>a[n]) puts("-1"); else search(); return 0; }