Tres formas de escribir plantillas dicotómicas

Escritura de intervalo abierto

int find1(int q) {//后继
	//开区间
	int  l = -1, r = n;
	while (l + 1 < r) {
		int mid = l + r >> 1;
		if (a[mid] <= q)l = mid;
		else r = mid;
	}
	return l;
}
int find2(int q) { //前区 可以直接 q+1就边后继了
	int l = -1, r = n;
	while (l + 1 < r) {
		int mid = l + r >> 1;
		if (a[mid] >= q)r = mid;
		else l = mid;
	}
	return r;
}

Escritura a intervalos cerrados

int find3(int q) {
	//闭区间写法
	int l = 0, r = n - 1;
	while (l < r) {
		int mid = l + r + 1 >> 1;
		if (a[mid] <= q) l = mid;
		else r = mid - 1;
	}
	return l;
}
int find4(int q) {
	int l = 0, r = n - 1;
	while (l < r) {
		int mid = l + r>>1;
		if (a[mid] >= q)r = mid;
		else l = mid+1;
	}
	return r;
}

ans registro signo igual

int find5(int q) {
	//闭区间
	int ans = 0;
	int l = 0, r = n - 1;
	while (l <= r) {
		int mid = l + r >> 1;
		if (a[mid] <= q) {
			ans = mid;
			l = mid + 1;
		}
		else r = mid - 1;
	}
	return ans;
}
int find6(int q) {
	int ans = 0;
	int l = 0, r = n - 1;
	while (l <= r) { // l = r + 1结束
		int mid = l + r >> 1;
		if (a[mid] >= q) {
			ans = mid;
			r = mid - 1;
		}
		else {
			l = mid + 1;
		}
	}
	return ans;
}

todos los codigos

#include<iostream>
using namespace std;
int a[1000]={1,2,3,4,5,5,6,7,9}, n = 9;
int find1(int q) {//后继
	//开区间
	int  l = -1, r = n;
	while (l + 1 < r) {
		int mid = l + r >> 1;
		if (a[mid] <= q)l = mid;
		else r = mid;
	}
	return l;
}
int find2(int q) { //前区 可以直接 q+1就边后继了
	int l = -1, r = n;
	while (l + 1 < r) {
		int mid = l + r >> 1;
		if (a[mid] >= q)r = mid;
		else l = mid;
	}
	return r;
}

int find3(int q) {
	//闭区间写法
	int l = 0, r = n - 1;
	while (l < r) {
		int mid = l + r + 1 >> 1;
		if (a[mid] <= q) l = mid;
		else r = mid - 1;
	}
	return l;
}
int find4(int q) {
	int l = 0, r = n - 1;
	while (l < r) {
		int mid = l + r>>1;
		if (a[mid] >= q)r = mid;
		else l = mid+1;
	}
	return r;
}
int find5(int q) {
	//闭区间
	int ans = 0;
	int l = 0, r = n - 1;
	while (l <= r) {
		int mid = l + r >> 1;
		if (a[mid] <= q) {
			ans = mid;
			l = mid + 1;
		}
		else r = mid - 1;
	}
	return ans;
}
int find6(int q) {
	int ans = 0;
	int l = 0, r = n - 1;
	while (l <= r) { // l = r + 1结束
		int mid = l + r >> 1;
		if (a[mid] >= q) {
			ans = mid;
			r = mid - 1;
		}
		else {
			l = mid + 1;
		}
	}
	return ans;
}
int main() {
	cout << find1(5)<<endl;//后继 为 5
	cout << find2(5)<<endl;//前驱 为4
	cout << find2(6)-1 << endl;//函数加1 ,外减-1就是后继
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/129013811
Recomendado
Clasificación