二分笔记qwq

无意中翻到了二分题目,居然好生疏!(要死 ),自己又复习了一遍,大致懂了二分模板的含义。
二分搜索,也叫做折半搜索、二分查找,用于在有序数组查找某个元素的算法。
如何搜索?二分搜索,顾名思义就是将一个数组对半分开(注:一定是有序数组),然后进行查找。这样做的好处就在于对于超大数据搜索的的时间大大降低。时间复杂度:O(log n)。
查找过程:首先将起点设为整个有序数组的中间,如正好为所要查找的值,直接输出;若所查找元素大于或小于中间元素,则在它所处在的一半寻找。
废话少说,上题目!
用二分递归实现在n个有序的数据中查找数据k,并输出k是数据中的第m个数。
格式:输入:第一行两个数n和k。接下来n个由小到大的数,每行1个数。 输出:k在数据中的位置m。如果数据中没有k,输出 -1
这是很典型的二分查找题目
利用二分特性,直接查找。
上代码:

#include
using namespace std;
int a[100005],k;
void work(int l,int r){
	int m=(l+r)/2;
	if(l>r) {
		cout<<-1;
		exit(0);//结束程序,这里和return不一样,return是退出递归,而exit是直接退出程序。 
	}//到达边界,证明找不到 K ,直接输出。 
	if(a[m]==k){
		cout<<m;
		exit(0);
	}//找到 K ,输出位置。
	 //没到边境且未找到 K ,进行递归。 
	if(a[m]>k) work(l,m-1);//当前遍历的值大于所要找的 K ,则遍历左半边,边界为mid-1。 
	else if(a[m]<k) work(m+1,r);// 前遍历的值大于所要找的 K ,则遍历右半边,起点为mid+1,边界为尽头。
	return;
}
int main()
{
	 int n;
	 cin>>n>>k;
	 for(int i=1;i<=n;i++)
	 {
	 	cin>>a[i];
	 }
	 work(1,n);//进入递归。 
	 
	return 0;
}
如有哪里不对,欢迎各位dalao评论啊!

你可能感兴趣的:(笔记)