• 二分查找---顺序查找


    二分查找---顺序查找
    
    顺序查找:在一个已知无序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。复杂度为o(n).
     
    二分查找又称折半查找,它是一种效率较高的查找方法。
      【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
      【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
      【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
      重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
      【算法复杂度】假设其数组长度为n,其算法复杂度为o(log(n))
     
    #include <stdio.h> 
     
    //二分查找: 
    int search(int a[],int x,int n) //x为要查找的元素,n为数组长度
    { 
     int mid=0; 
     int low=0; 
     int high=n; 
     while(low<=high) 
     { 
      mid=(low+high)/2; 
      if(a[mid]==x) 
      { return mid; } 
      else if(x<a[mid]) 
      { high=mid-1; } 
      else
      { low=high+1; } 
     } 
     return -1; 
    } 
    //顺序查找: 
    int search1(int a[],int x,int n) //x为要查找的元素,n为数组长度
    { 
     int i; 
     for(i=0;i<n;i++) 
     { 
      if(a[i]==x) 
       return i;    
     } 
     return -1;
    }
     
    int main()
    {
     int i,a[10],x;
     for(i=0;i<10;i++)
      scanf("%d",&a[i]);
     printf("请输入要查找的元素");
     scanf("%d",&x);
     if(search(a,x,10)!=-1)printf("查找的元素在数组中的位置为%d.
    ",search(a,x,10));
     else printf("该元素不在数组中
    ");
     if(search1(a,x,10)!=-1)printf("查找的元素在数组中的位置为%d.
    ",search1(a,x,10));
     else printf("该元素不在数组中
    ");
     return 0;
    }
     
    评论|0
      
     
     
     2008-11-25 12:40friday_collin|七级
     
    /*顺序查找:*/
    #include<stdio.h> 
    void main() 
    { 
    int a[10]={1,2,3,4,5,6,7,8,9,10}; 
    int i,x,y; 
    printf("输入你要查找的数:
    "); 
    scanf("%d",&x); 
    y=0; //标记是否已找到,y=1表是找到了,y=0表示没找到 
    for(i=0;i<10;i++) //循环,把x和数组中的元素一个个比较 
    { 
    if(x==a[i]) //如果x=a[i]说明已经找到 
    { 
    y=1; //把y变成1,说明已经找到了 
    printf("你要查找的数%d在第个%d位置
    ",x,i+1); //输出找到的相关信息 
    break; //跳出循环 
    } 
    } 
    if(y==0)printf("无法找到你要查找的数
    "); //y=0表示找不到 
    }
     
    /*二分查找:   添个主函数调用下就好了*/
    int search(int a[],int x,int n) 
    { 
    int mid=0; 
    int low=0; 
    int high=n; 
    while(low<=high) 
    { 
    mid=(low+high)/2; 
    if(a[mid]==x) 
    { return mid; } 
    else if(x<a[mid]) 
    { high=mid-1; } 
    else
    { low=high+1; } 
    } 
    return -1; 
    }
    ************************************************************************
     
     
     
     
     
    #include <stdio.h>
    void sort(int a[], int i,int num);
    main()
    {
        int a[4]={2,3,4,5};
        int num;
        printf("请输入要查找的号码:");
        scanf("%d",&num);
        sort(a,4,num);
         
    }
    //二分法 a[]为数组,n为数组大小,num为要查找的数字
    void sort(int a[],int n,int num)
    {
        int high,low,mid,flag = 1;
        high=n-1;
        low=0;
        while(low<=high)
        {
            mid = (high+low)/2;
            if(a[mid]<num)
            {
                low = mid+1;
            }
            else if(a[mid]>num)
            {
                high = mid -1;
            }
            else
            {
                printf("位置在第%d位:",mid+1);
                printf("%d",a[mid]);
                flag = 0;
                break;
            }
        }
        if(flag)
        {
            printf("无此数字");
        }
    }
      
    
     
    
     
    
     
    
     
    
     
    
     
    
    题目:用选择法对10个数字排序(从小到大),
    然后输入一个数,用折半法找出该数是数组中第几个元素的值,
    如果该数不在数组中,则打印出“无此数”。源程序命名为4.c其中选择法部分已经写出,折半法怎么写啊?
    希望大侠尽量用折半法最常规的思路。
     
    #include<stdio.h> 
    void main() 
    {  int a[11],i,t,j;  
    printf("please input 10 numbers :
    "); 
     for(j=1;j<11;j++)   
    scanf("%d",&a[j]); 
     printf("
    ");  
    for(j=1;j<11;j++)   
    for(i=j+1;i<11;i++)  
     if (a[j]<a[i])    
     {      t=a[j];      a[j]=a[i];      a[i]=t;     }
     
     
     
    puts("Please input the number to be found");
    scanf("%d",&t);
    putchar('
    ');i=1;j=10;//i,j表示在在数组a的第i个到第j个元素的范围内查找t
    while (i<j)//i==j表明t只有可能是数组a的第i个元素
    {
    if (t<=a[(i+j)/2]) 
    j=(i+j)/2;//此时t在第i个到第(i+j)/2个元素的范围内
     
    else i=(i+j)/2+1;//此时t在第(i+j)/2+1个到第j个元素的范围内
    }
    if (a[i]!=t) 
    puts("No such element!");//没找到
    else
     printf("%d is element %d of the array.
    ",t,i);//找到了
    }
  • 相关阅读:
    linux搭建java环境
    linux搭建mavne
    linux定时备份mysql数据库
    ThreadPoolTaskExecutor和ThreadPoolExecutor有何区别?
    mysql 的YEARWEEK 和DATE_FORMAT(周统计跨年问题)
    MySql表连接
    ETCD V3学习摘要
    写了点Docker笔记
    Github Page集成Gitalk,未找到相关的 Issues 进行评论,且点击登录后跳转回主页
    从Attention到SelfAttention再到MultiHead Attention的一点小笔记
  • 原文地址:https://www.cnblogs.com/wangprince2017/p/7678166.html
Copyright © 2020-2023  润新知