C语言排序(二)——二分查找

一.实验内容

①顺序查找算法与二分查找算法比较。

a.定义两个函数分别实现顺序查找和二分查找算法。

b.主函数中用产生随机数的方式随机产生待查数据,通过调用口面编写函数查找指定的数据。

c.测试数据分别选择:在1000 10000 1000001000000个数中查找指定数据,对比两个函数的运行时间。

d. 得出结论这两个算法哪个效率高。

②朴素算法与分治算法计算x的n次方的算法比较。

a.定义两个函数实现计算x的n次方的朴素算法和分治算法。

b.输入x和n的值,调用这两个函数计算x的n次方的结果并求这两个函数的运行时间。

c.得出结论这两种算法哪个效率更高。


二.实验代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<dos.h>
#include<conio.h>
int main()
{
    int n,key;//n为数组的个数,key是要查找的关键字
    int s[100000];//定义随机查找数组
    int t1,t2,t3,t4;//分别对应几个函数所用的操作时间
    int i,j,m;
    int x,y;//x为幂y为指数
    int Search_seq(int a[],int b,int c);//顺序查找
    int Search_bin(int a[],int b,int c);//折半查找
    int recur_1(int a,int b);//分治算法
    int simple_2(int a,int b);//朴素算法
    printf("输入产生随机数个数:");
    scanf("%d",&n);
    srand(time(NULL));
    for(i=1;i<=n;i++)//产生随机数组
    {
        s[i]=rand()%100000+1;
    }
    for(i=2;i<=n;i++)//利用直接排序法对随机数组进行排序
    {
        m=s[i];
        j=i-1;
        while(j>0&&s[j]>m)
        {
            s[j+1]=s[j];
            s[j]=m;
            j--;
        }
    }
    for(i=1;i<=n;i++)//输出所产生的有序的数组
    {
        printf("%d ",s[i]);
    }
    printf("\n");//从以产生的有序的数组中寻找一个关键字
    printf("输入要查找的关键字:");
    scanf("%d",&key);
    printf("进行顺序查找所循环的次数:");
    t1=Search_seq(s,n,key);
    printf("%d\n",t1);
    printf("进行折半查找所循环的次数:");
    t2=Search_bin(s,n,key);
    printf("%d\n",t2);
    printf("\n\n\n");//换行用
    printf("输入x的值:");
    scanf("%d",&x);
    printf("输入幂y的值:");
    scanf("%d",&y);
    printf("用分治计算函数运行时间:");
    t3=recur_1(x,y);
    printf("%d\n",t3);
        printf("用朴素计算函数运行时间:");
    t4=simple_2(x,y);
    printf("%d\n",t4);

    return 0;
}

int Search_seq(int a[],int b,int c)//计算顺序查找查找时间
{
    int i=1;
    int num1=0;
    while(i<=b)//循环顺序查找
    {
        if(a[i]==c) break;
        else
            i++;
        num1++;
    }
    
    return num1;//返回顺序查找所循环的次数
}

int Search_bin(int a[],int b,int c)//计算折半查找所需时间
{
    int low,high,mid;
    int num2=0;
    low=1;high=b;

    while(low<=high)//对已有数组进行折半查找
    {
        mid=(low+high)/2;
        if(mid==c) break;
        if(low<c&&c<mid)
        {high=mid-1;}
        else
        {low=mid+1;}
        num2++;
    }

    return num2;//返回查找所循环的次数
}
int simple_2(int a,int b)//朴素算法函数
{
    int i=1;
    int num=1;
    clock_t start,end;//时间函数
    start=clock();
    while(i<=b)
    {
        num=a*num;
        i++;
    }
    end=clock();
    return difftime(end,start);//返回朴素算法所需要的时间
}
int recur_1(int a,int b)//分治算法函数
{
    int num,m,s;
    clock_t start,end;//定义时间函数
    start=clock();
    if(b==1)
      num=a;
    if(b>1)
    { 
        m=b/2;
        s=recur_1(a,m);//利用递归循环
        if(b%2==0)
        {
            num=s*s;
        }
        else
        {
            num=a*s*s;
        }
    }
    end=clock();
    return  difftime(end,start);//返回分治所需要的时间
}


三.实验结果



四.实验总结

    折半查找比顺序查找效率更高,分治递归算法比朴素算法效率更高。使用合理的排序算法,能够极大的提高程序的运行效率,节约时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值