【大话数据结构C语言】51 查找算法

举报
CodeAllen 发表于 2021/10/29 23:46:41 2021/10/29
【摘要】 欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取精品学习资源 程序员技术交流①群:736386324 ,程序员技术交流②群:371394777     静态查找和动态查找 静态查找:数据集合稳定,不需要添加,删除元素的查找操作。 动态查找:数据集合在查找的过程中...

欢迎关注我的公众号是【CodeAllen】,关注回复【1024】获取精品学习资源
程序员技术交流①群:736386324 ,程序员技术交流②群:371394777    

静态查找和动态查找

静态查找:数据集合稳定,不需要添加,删除元素的查找操作。
动态查找:数据集合在查找的过程中需要同时添加或删除元素的查找操作。

关键字

在查找表查找某个特定元素时,前提是需要知道这个元素的一些属性。例如,每个人上学的时候都会有自己唯一的学号,因为你的姓名、年龄都有可能和其他人是重复的,唯独学号不会重复。 而学生具有的这些属性(学号、姓名、年龄等)都可以称为 关键字
关键字又细分为 主关键字 次关键字 若某个关键字可以唯一地识别一个数据元素时,称这个关键字为 主关键字 ,例如学生的学号就具有唯一性; 反之,像学生姓名、年龄这类的关键字,由于不具有唯一性,称为 次关键字

查找结构

对于静态查找来说,我们不妨可以用线性表结构组织数据,这样可以使用顺序查找算法,如果我们再对关键字进行排序,则可以使用折半查找算法或斐波那契查找算法等来提高查找的效率。
对于动态查找来说,我们则可以考虑使用二叉排序树的查找技术,另外我们还可以使用散列表结构来解决一些查找问题,这些技术我们都将在这部分教程里边介绍给大家。

顺序查找

顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从第一个(或者最后一个)记录开始,逐个进行记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功。如果查找了所有的记录仍然找不到与给定值相等的关键字,则查找不成功。
实例代码:Sq_Search.c

   
  1. // 顺序查找,a为要查找的数组,n为要查找的数组的长度,key为要查找的关键字
  2. int Sq_Search(int *a, int n, int key)
  3. {
  4.     int i;
  5.     for( i=1; i <= n; i++ )
  6.     {
  7.         if( a[i] == key )
  8.         {
  9.             return i;
  10.         }
  11.     }
  12.     return 0;
  13. }

优化代码:Sq_Search_2.c

   
  1. // 顺序查找优化方案,a为要查找的数组,n为要查找的数组的长度,key为要查找的关键字
  2. int Sq_Search(int *a, int n, int key)
  3. {
  4.     int i = n;
  5.     a[0] = key
  6.     while( a[i] != key )
  7.     {
  8.         i--;
  9.     }
  10.     
  11.     return i;
  12. }

问题:假设以下有一个结构体存放的是学生的记录,每条记录包括: 学号、姓名、成绩,请编写一个程序,要求输出1024编号同学的具体信息。

 

   
  1. #include <stdio.h>
  2. typedef struct student
  3. {
  4.     int id;
  5.     char name[10];
  6.     float score;
  7. }Student;
  8. float search(Student stu[], int n, int key)
  9. {
  10.     int i;
  11.     
  12.     for( i=0; i < n; i++ )
  13.     {
  14.         if( stu[i].id == key )
  15.         {
  16.             return i.score;
  17.         }
  18.     }
  19.     
  20.     return -1;
  21. }
  22. int main()
  23. {
  24.     Student stu[4] = {
  25.         {1024"Q"100}, 
  26.         {1026"W"60}, 
  27.         {1028"E"100}, 
  28.         {1030"R"60}
  29.         };
  30.     
  31.     float score;
  32.     
  33.     score = search(stu, 41024);
  34.     printf("1024号的成绩是:%f", score);
  35.     
  36.     return 0;
  37. }

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/116862773

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。