• 二分查找递归和非递归实现(c语言实现)


    #include<stdio.h>++
    int seeqSearch(int a[],int n,int k){
        int i=n-1;
        for(;i>=0;i--){//遍历数组
            if(a[i]==k){//找到对应的数组
                return i;//返回该数组的下标
            }
        }
        return -1;//失败返回值为-1
    }
    int  binSearch(int a[],int n,int k){
        int mid,hig,low;//定义指向中间高位和low的元素
        hig=n-1;//为高位指针赋初值
        low=0;//地位赋初值
        while(low<=hig){//到low大于hig时代表未找到退出循环
            mid=(hig+low)/2;//为mid赋值
            if(a[mid]==k){
                return mid;//当找到到的时候返回该数的下标
            }
            else if(a[mid]>k){//如果当前的数的值大于k
                hig=mid-1;//当前的mid-1赋值给hig
            }
            else if(a[mid]<k){//如果当前的数的值小于k
                low=mid+1;//当前的mid+1赋值给low
            }


        }
        return -1;//失败返回-1
    }
    int  binSearch2(int a[],int low,int hig,int k){//此方法为递归算法
        int mid;//定义指向中间的指针
        if(low>hig){
            return -1;
        }else{
            mid=(hig+low)/2;//为mid赋值
            if(a[mid]==k){
                return mid;//当找到到的时候返回该数的下标
            }
            else if(a[mid]>k){//如果当前的数的值大于k
                binSearch2(a,low,mid-1,k);//调用递归算法
            }
            else if(a[mid]<k){//如果当前的数的值小于k
                binSearch2(a,mid+1,hig,k);//调用递归算法
            }
        }
    }
    int main(){
        int a[10001];//定义一个数组用来存放元素
        int n,i=0;//定义一个存放个数和计数器
        printf("请输入你要输入的元素的个数:");
        scanf("%d",&n);
        while(n--){
            printf("\n这是你要存入的第%d个元素:\n",i+1);
            scanf("%d",&a[i]);
            i++;
        }
        n=i;
        printf("请输入你要查找的元素的数值:\n");
        int k;
        scanf("%d",&k);
        i=seeqSearch(a,n,k);//首先是进行顺序查找得到下标
        if(i==-1){//当返回值为-1代表没有查到
            printf("你拨打的用户不在服务器,请稍后在拨!!!\n");
            return 0;
        }
        printf("查找到的元素是第%d个\n",i+1);//打印输出得到的下标的数
        i=binSearch(a,n,k);//其次是进行二分查找得到下标
        printf("查找到的元素是第%d个\n",i+1);//打印输出得到的下标的数
        i=binSearch2(a,0,n-1,k);//递归算法
        printf("查找到的元素是第%d个\n",i+1);//打印输出得到的下标的数
        return 0;
    }
  • 相关阅读:
    逻辑卷扩容
    iptables网络防火墙||SNAT,DNAT等转发路由动作
    常用rman操作语句
    常用Oracle的SQL语句
    oracle中的单引号和双竖线||以及q'间隔符
    网站升级HTTPS教程
    站长必备:网站被黑后怎么快速搞定
    常见HTTP错误代码
    在Android中实现一个简易的Http服务器
    Android开发新手常见的10个误区
  • 原文地址:https://www.cnblogs.com/csnd/p/16675686.html
Copyright © 2020-2023  润新知