[算法][二分法查找]

 

 

 1 /*
 2 二分法实验
 3 1、设a[0:n-1]是一个已排好序的数组.
 4 请改写二分搜索算法,使得当搜索元素x不在数组中时,
 5 返回小于x的最大元素的位置I和大于x的最大元素位置j.
 6 当搜索元素在数组中时,I和j相同,均为x在数组中的位置.
 7 2、设有n个不同的整数排好序后存放于t[0:n-1]中,
 8 若存在一个下标I,0<=i<n,使得t[i]=i,
 9 设计一个有效的算法找到这个下标.
10 要求算法在最坏的情况下的计算时间为O(logn).
11 */
12 #include<iostream>
13 using namespace std;
14 /*
15 功能:1\二分查找改进版
16 输入:拍好序的a[],大小n,待查数x,返回参数i,j
17 返回:真:找到
18 */
19 bool BinarySearch(int *a,int n,int x,int& i,int& j){
20     int left=0;
21     int right=n-1;
22     while(left<=right){
23         int mid=(left+right)/2;
24         if(x==a[mid]){
25             i=j=mid;
26             return true;
27         }
28         if(x>a[mid])
29             left=mid+1;
30         else
31             right=mid-1;
32     }
33     i=right;
34     j=left;
35     return false;
36 }
37 /*
38 功能:2\高效查找
39 输入:数组,大小,待查值
40 返回:下标,若没有返回-1
41 */
42 int SearchTag(int *a,int n,int x){
43     int left=0;
44     int right=n-1;
45     while(left<=right){
46         int mid=(left+right)/2;
47         if(x==a[mid]) return mid;
48         if(x>a[mid])
49             left=mid+1;
50         else
51             right=mid-1;
52     }
53     return -1;
54 }
55 int main(){
56     int n,i,j,a[1000],x;
57     while(cin>>n){//输入数组大小
58         for(i=0;i<n;i++)cin>>a[i];//输入数据,需要从小到大
59         cin>>x;//输入待查数据
60         BinarySearch(a,n,x,i,j);//超找
61         cout<<"用函数1找到的i,j为: "<<'('<<i<<','<<j<<')'<<'\n';//输出对应的i,j
62         cout<<"用函数2找到的下标为: "<<SearchTag(a,n,x)<<"\n\n";//输出2找到的下标
63     }return 0;
64 }

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值