c语言 顺序查找与二分查找

二分查找必须是有顺序的序列(序列从大到小或从小到大)

二分查找思想:一段有序序列,取中间值(a[(i+j)/2])和要查找的值比较(假设序列为升序),如果中间值小于要查找的值,则取中间值右侧一段的中间值在进行比较,直到找到或遍历结束为止。

如图找24

400

顺序查找与二分查找比较运行时间代码

#include<stdio.h>

#include<time.h>//clock函数头文件

#include<stdlib.h>//strand,rand函数头文件

inta[1000000];//用于存储有序的数字的数组

doubleshunxu(int a[],int num,int n)//顺序查找函数

{

    clock_t beg,end;//起始时间和结束时间

    double time;//顺序查找运行时间

    int i;

    beg=clock();//起始时间

    for(i=0;i<n;i++)//循环从第一个数开始比较

    {

        if(a[i]==num)//相等则找到待查数

        {

            printf("顺序查找找到指定数据%d\n",a[i]);

            break; //跳出循环,不在进行查找

        }

    }

    if(i==n)

    {

        printf("顺序查找未找到指定数据\n");

    }

    end=clock();//结束时间

    time=(double)(end- beg) / CLOCKS_PER_SEC;//顺序查找运行时间

    return time;

}

doubleerfen(int a[],int num,int n)//二分查找函数

{

    clock_t beg,end;//同上

    double time;

    int low=0,mid,high=n-1;//low为数组第一个数下标,mid为中间数下标,high为最后一个数下标

    beg=clock();//起始时间

    while(low<=high)//进行循环low>high时数组遍历完成

    {

        mid=(low+high)/2;//求出新的中间数的下标

        if(a[mid]<num)//当中间数小于待查数,待查数在中间数右面

        {

            low=mid+1;//将中间数下一个的下角标赋值给low

        }

        else if(a[mid]>num)//当中间数大于待查数,待查数在中间数左面

        {

            high=mid-1;//将中间数前一个的下角标赋值给high

        }

        else

        {

            printf("二分查找找到指定数据:%d\n",a[mid]);//中间值为待查值

            break;

        }

    }

    if(low>high)

    {

        printf("二分查找未找到指定数据\n");

    }

    end=clock();//结束时间

    time=(double)(end- beg) / CLOCKS_PER_SEC;//运行时间

    return time;

}

intmain()

{

    int n,m,num,i;

    printf("请输入数字个数:");

    scanf("%d",&n); //n为数组数字个数

    for(i=0;i<n;i++)//生成从小到大的有序数组

    {

        a[i]=i;

    }

    srand(time(NULL));

    m=n-n/10+1;

    num=rand()%m+(n/10);//随机生成一个待查数

    printf("随机数为:%d\n",num);

    printf("顺序查找运行时间为:%f\n",shunxu(a,num,n));

    printf("二分查找运行时间为:%f\n",erfen(a,num,n));

    return 0;

}





猜你喜欢

转载自blog.csdn.net/yang03_26/article/details/80802305