算法基础——二分检索

二分检索来查找一个数据是很快速的一种方法是一种很优秀的算法。

我们现在有一个有序的数组我们需要查找它里面的一个元素。这时候我们应该怎么办呢,我们可以从这个数组的中间位置去查找。如果要寻找的数字比数组中间的数字大那么我们在这个数组的后半部分去查找,如果要寻找的数字比数组中间的数组小那么我们应该在这个数组的前半部分去查找。通过这样的方法我们可以比较快速地查找到这个元素。

先看Pseudocode语言所书写的伪代码

procedure BINSRCH(A,n,x,j)

//给定一个按非降次序排列的元素数组A(1:n),n≥1,判断x是否出现。若是,则置j,使得x=A(j),若非,j=0//

  integer low,high,mid,j,n;

  low<-1;high<-n

  while low≤high do

       mid<-(low+high)/2

case

    :x<A(mid):high<-mid-1

    :x>A(mid):low<-mid+1

    :else:j<-mid;return j

end case

   repeat

j<-0;return j

end BINSRCH

我们在这里可以看到主要是通过low和high还有mid来控制查询的,low和high是随着程序的运行而逐步发生改变的。程序是有出口的当我们发现low不是≤high的时候我们就可以退出了说明找不到。

这是我个人所书写的代码

#include<stdio.h>
#include<stdlib.h>
int w[7] = {0, 5, 10, 12, 13, 15, 18};//数组元素
int low;int high;int mid; int n; 
void pd(int n,int low,int high){
    if(low<=high){
      mid=(low+high)/2;
      if(n>w[mid-1]){
          low=mid+1; pd(n,low,high);//low发生改变在重新调用该函数
      }
      if(n<w[mid-1]){
          high=mid-1; pd(n,low,high);//high发生改变再重新调用该函数
      }    
      if(n==w[mid-1]){
          printf("查找成功\n");
          printf("是数组中第%d个数字",mid);
          exit(0); 
      }
    }
    else//查找失败了需要跳出去
    printf("查找失败\n");

int main()
{
    printf("输入你想要查找的数字\n"); 
    scanf("%d",&n);
    pd(n,1,7);
    return 0;

这个算法是很简单的是很容易理解的,但是局限性是很明显的它必须要求是有序的数组这个限制就很大了

时间复杂度:                        

成功:最好 O(1)                                   

平均      O(logn)                                 

最坏      O(logn)                      

不成功: O(logn)   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用编程写诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值