二分搜索技术

来源:互联网 发布:软件项目研究开发方法 编辑:程序博客网 时间:2024/06/05 07:49
二分搜索技术
题目描述
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。
输入
输入包括若干个用例,第一行为一个正整数n表示用例个数,接下来每个用例占两行,第一行为为一个正整数k和x,表示k个元素,要求查找x,第二行为k个已排序正整数,
输出
每个用例用一行输出找出的元素的位置和比较次数,用一个空格隔开,如果不存在,则位置用0表示。
样例输入
4
5 3
1 2 3 4 5
6 7
2 3 4 6 8 10
10 40
1 5 9 10 20 25 33 35 38 39
3 8
2 5 8
样例输出
3 1
0 3
0 4

3 2

一个简单二分搜索。

递归的方法:

#include <iostream>using namespace std;int goal,cont;int find(int a[] ,int left,int right){if(left>right)return -1;else{cont++;int mid = (left+right)/2;  //中间的下标if(goal==a[mid])return mid;else if(goal<a[mid])return find(a,left,mid-1);elsereturn find(a,mid+1,right);}    }  int main(){int n;int len;int a[100000];cin>>n;while(n--){cont=0;cin>>len>>goal;for(int i=0; i<len; i++)cin>>a[i];int s = find(a,0,len-1);cout<<s+1<<" "<<cont<<endl;}return 0;}

非递归:

#include <iostream>using namespace std;int cont;int findata(int a[],int x,int n){  int left=0,right=n-1;  while(left<=right)  {  cont++;  int mid = (left+right)/2;  if(x==a[mid])  return mid;  else if(x<a[mid]) right = mid -1;  else  left = mid+1;  }  return -1;}int main(){int t,n,a[50000],i,x;cin>>t;while(t--){cont=0;cin>>n>>x;for(i=0; i<n; i++)cin>>a[i];int s = findata(a,x,n);cout<<s+1<<" "<<cont<<endl;}return 0;}


0 0
原创粉丝点击