1. 程式人生 > 其它 >折半查詢法

折半查詢法

折半查詢法

折半查詢法,一種基於分治思想的查詢演算法,對於一串按照從小到大或從大到小順序排列的數字,折半查詢法最壞的時間複雜度為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;
}