zoukankan      html  css  js  c++  java
  • C语言之三大查找算法

    查找算法

    1.二分查找

    二分查找就是折半查找,其基本思想是:首先选取表中间位置的记录,将其关键字与给定关键字key进行比较,若相等,则查找成功。若key值比该关键字值大,则要找的元素一定在右子表中,则继续对右子表进行折半查找;若key值比该关键字值小,则要找的元素一定在左子表中,则继续对左子表进行折半查找。依次类推,直到查找成功或者查找失败。

    源代码如下:

    #include<stdio.h>
    void binary_search(int a[],int key,int n);
    int main(void)
    {
    int i,n,m,a[16];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    scanf("%d",&m);
    binary_search(a,m,n);
    return 0;
    }
    void binary_search(int a[],int key,int n)
    {
    int low=0;
    int high=n-1;
    int mid,count=0,count1;
    while(low<high)
    {
    count++;
    mid=(low+high)/2;                       //二分查找
    if(key>a[mid])
    low=mid+1;
    if(key<a[mid])
    high=mid-1;
    if(key==a[mid])
    {
    printf("Find it and location is %d ",mid);
    count1++;                         //标记查找成功
    break;                               //退出循环
    }
    }
    if(count1==0)
    printf("error ");
    }

    效果图:

    2.分块查找

    分块查找也称为索引顺序查找,要求将待查的元素均匀地分成块,块间按大小排序,块内不排序,所以要建立一个块的最大关键字表,成为索引表。
    下面是将15个数按关键字大小分成了3块,这15个数的排列是一个有序序列。也可以是无序的,但必须满足分在第一块中的任意数都小于第二块中的所有数。先顺序查找已在已建好的索引表中查出key所在的块中,再在块中顺序查找key。

    源代码如下:

    #include<stdio.h>
    int block_search(int,int a[]);
    struct index                               //定义结构体
    {
    int key;
    int start;
    int end;
    }index_table[3];
    int main(void)
    {
    int i,j=0,a[16],n;
    for(i=1;i<16;i++)                     //以用户的视觉给出位置数目
    scanf("%d",&a[i]);
    scanf("%d",&n);
    for(i=0;i<3;i++)                       //设置每块的起止位置以及关键值
    {
    index_table[i].start=j+1; 
    j++;
    index_table[i].end=j+4;
    j+=4;
    index_table[i].key=a[j];
    }
    if(block_search(n,a))
    printf("Find it and location is %d ",block_search(n,a));
    else
    printf("error! ");
    }
    int block_search(int value,int a[])
    {
    int i=0,j;
    while(i<3&&value>index_table[i].key)                  //确定查找值所在块
    i++;
    if(i<3)
    {
    j=index_table[i].start;
    while(j<index_table[i].end&&value!=a[j])            //顺序查找值
    j++;
    if(j<=index_table[i].end)
    return j;
    else
    return 0;
    }
    else
    return 0;
    }

    效果图:

    3.哈希查找

    给定哈希表长度为11,哈希函数为H(key)=key%11,随机产生待散列的小于50的8个元素,同时采用线性探测再散列的方法处理冲突。

    源代码如下:

    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    #define Max 11
    #define N 8
    int hashtable[Max];
    int search(int);
    void creathash(int);
    int func(int);
    int main(void)
    {
    int flag[50],i,j,t;
    for(i=0;i<50;i++)
    flag[i]=0;                                   //50以内所有数为产生时,均标志为0
    for(i=0;i<Max;i++)
    hashtable[i]=-1;                         //哈希表中,初始位置全置为-1
    srand((unsigned long)time(0));    //用0调用时间函数time(),将其返回值强制转换为unsigned型,作为参数来调用srand( )函数。srand( )是为rand( )函数初始化随机发生器的启动状态,以产生伪随机数,所以常把srand( )称为种子函数。用time()返回的时间值做种子的原因是time()返回的是实时时间值,每时毎刻都在变化,这样产生的伪随机数就有以假乱真的效果。
    i=0;
    while(i!=N)                          //产生八个数
    {
    t=rand()%50;                      //产生一个随机数赋予t
    if(flag[t]==0)                       //看是否产生过t

    creathash(t);                       //创建哈希表
    printf("%d",t);
    for(j=0;j<Max;j++)
    printf("(%2d)",hashtable[j]);
    printf(" ");
    flag[t]=1;
    i++;
    }
    }
    scanf("%d",&t);                   //输入要查找的元素
    if(t>=0&&t<50) 
    {
    i=search(t); 
    if(i)
    printf("Find it and location is %d ",i);
    else
    printf("Not find it ");
    }
    else
    printf("error ");
    return 0;
    }
    void creathash(int key)
    {
    int pos,t;
    pos=func(key);                           //哈希函数确定元素的位置
    t=pos;
    while(hashtable[t]!=-1)               //如果该位置有元素存在,则进行线性探测再散列
    {
    t=(t+1)%Max;
    if(t==pos)                                //哈希表满的情况
    {
    printf("table is full");
    return ;
    }
    }
    hashtable[t]=key;                     //将元素放入确定的位置
    }
    int func(int value)
    {
    return value%Max;                      //哈希函数
    }
    int search(int value)
    {
    int pos,t;
    pos=func(value);
    t=pos;
    while(hashtable[t]!=value&&hashtable[t]!=-1)          //如果该位置不等于要查找的关键字且不为空
    {
    t=(t+1)%Max;
    if(pos==t)                                    //多次探测返回原来哈希函数求出的位置,说明要查找的数不存在
    return 0;
    }
    if(hashtable[t]!=-1)
    return t;
    else
    return 0;
    }

    效果图:

  • 相关阅读:
    【资源共享】JNI 课题
    Firefly自动售货机解决方案
    【资源共享】Android开发技巧整理
    【资源共享】《Rockchip IO-Domain 开发指南 V1.0》
    【人脸识别+硬件】Firefly推出可商业化的人脸识别方案
    【技术案例】双目摄像头数据采集
    windows环境常用网络命令测试和分析(51cto实验01~02)
    利用三层交换机实现VLAN间路由配置
    c++11
    归并排序
  • 原文地址:https://www.cnblogs.com/tuifeideyouran/p/3149706.html
Copyright © 2011-2022 走看看