查找算法的实现(C/C++实现)

存档:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define max 20
 4 typedef int keytype;
 5 #include "search.h"
 6 int main()
 7 {
 8     sstable st;
 9     keytype key;
10     int result,num;
11     init(st);
12     printf("***************************************\n");
13     printf("1.顺序查找\n");
14     printf("2.折半查找\n");
15     printf("3.输出表信息\n");
16     printf("4.退出\n");
17     printf("***************************************\n");
18     printf("请输入你的选择:\n");
19     scanf("%d",&num);
20     while(1)
21     {
22         switch(num)
23         {
24             case 1:
25                 printf("请创建顺序查找表");
26                 create(st);
27                 printf("请输入顺序查找的关键字:");
28                 scanf("%d",&key);
29                 result=search_seq(st,key);
30                 if(result!=0)
31                     printf("在顺序表里第%d个位置查找到了!\n",result);
32                 else
33                     printf("在顺序表里没有找到!\n");
34                 break;
35             case 2:
36                 printf("请创建递增的折半查找表\n");
37                 create(st);
38                 printf("请输入折半查找的关键字:");
39                 scanf("%d",&key);
40                 result=search_bin(st,key);
41                 if(result!=0)
42                     printf("在顺序表里第%d个位置查找到了!\n",result);
43                 else
44                     printf("在顺序表里没有找到!\n");
45                 break;
46             case 3:
47                 print(st);
48                 break;
49             case 4:
50                 exit(0);
51                 break;
52             default:printf("输入错误!\n");
53         }
54         printf("\n请重新输入您的选择:\n");
55         scanf("%d",&num);
56     }
57     return 0;
58 }
 1 typedef char infotype;
 2 typedef struct
 3 {
 4     keytype key;//keytype为关键字的数据类型
 5     infotype other;//其他数据
 6 }elemtype;//数据元素类型
 7 typedef struct
 8 {
 9     elemtype *r;//基地址
10     int length;//元素个数
11 }sstable;//静态查找表
12 int init(sstable &l)//初始化静态查找表,分配资源
13 {
14     l.r=new elemtype[max];
15     if(!l.r)
16     {
17         printf("初始化错误!\n");
18         return 0;
19     }
20     l.length=0;
21     return 1;
22 }
23 void print(sstable l)//打印静态查找表的内容
24 {
25     for(int i=1;i<=l.length;i++)
26         printf("%d号关键字:%d\n",i,l.r[i].key);
27     printf("元素个数:%d\n",l.length);
28 }
29 int create(sstable &l)//创建表,对表中输入数据
30 {
31     l.length=0;
32     int k,i;
33     printf("请输入int型关键字,以-1结束:\n");
34     scanf("%d",&k);
35     while(k!=-1)
36     {
37         l.r[l.length+1].key=k;//0号位置留空
38         l.length++;
39         if(l.length>=max)
40             return 0;
41         scanf("%d",&k);
42     }
43     printf("下标:");
44     for(i=1;i<=l.length;i++)
45         printf("%4d",i);
46     printf("\n");
47     printf("key :");
48     for(i=1;i<=l.length;i++)
49         printf("%4d",l.r[i].key);
50     printf("\n");
51     return 1;
52 }
53 int search_seq(sstable st,keytype key)//在顺序表ST中顺序查找其关键字等于key的数据元素
54 {
55     //若找到,则函数值为该元素在表中的位置,否则为0
56     st.r[0].key=key;
57     for(int i=st.length;i>=1;i--)//从后往前找
58     {
59         if(st.r[i].key==key)
60         {
61             return i;
62         }
63     }
64     return 0;
65 }
66 int search_bin(sstable st,int key)//在有序表ST中折半查找其关键字等于key的数据元素
67 {
68     //若找到,则函数值为该元素在表中的位置,否则为0
69     int low=1;
70     int high=st.length;
71     int mid;
72     while(low<=high)
73     {
74         mid=(low+high)/2;
75         printf("折半查找的low值%d、high值%d、mid值%d\n",low,high,mid);
76         if(key==st.r[mid].key)
77             return mid;
78         else if(key<st.r[mid].key)
79             high=mid-1;
80         else
81             low=mid+1;
82     }
83     return 0;//表中不存在待查元素
84 }

运行结果如下:

时间: 2024-11-08 21:24:09

查找算法的实现(C/C++实现)的相关文章

通用固定长度编码格式的字符串查找算法的实现

通用固定长度编码格式的字符串查找算法的实现 字符串的查找是数据库应用中必不可少的操作,而且每种数据库产品(ORACLE.DB2.SYBASE.MS SQL SERVER.MYSQL等等)也都提供了对应的字符串处理函数,比如DB2的LOCATE函数. 但在实际的工作中,还是会遇到一些特殊情况的处理,这使得直接使用字符串查找函数,得到的结果可能是错误的,比如本文中提到的固定长度编码格式的字符串的查找.值得注意的是,本文提出的算法可以稍加修改即移植到其它关系数据库系统或者前端开发工具中. 在实际数据库

基于数组二分查找算法的实现

基于数组二分查找算法的实现 二分查找 查找 算法 赵振江 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功

分块查找算法的实现。在数组{90,43,15,32,78,9,66,49,35,71,22,86,18,53}中查找关键字为35的码--简单

源程序: // 32 66 90//15,32,9,22,18 43,66,49,35,53 90,78,71,86 //分析:分块查找由索引查找和子表查找两步完成.设n个数据元素的查找表分为m个子表,且每个子表//均为t个元素,则t=n/m .这样,分块查找的平均查找长度为:// ASL=ASL索引表+ASL子表=1/2(m+1)=1/2(m+n/m)+1//可见,平均查找长度不仅和表的总长度n有关,而且和所分的子表的个数m有关. #include <stdio.h> #define LEN

单链表上查找算法的实现(0955) swust-oj

Description 建立一个长度为n的带头结点的单链表,在该表中寻找第i个结点,若找到,则输出“OK!”,否则输出“error!”.处理数据类型为整型. input 第一行为链表的长度n: 第二行为链表中的数据元素: 第三行为要找的结点i. Output 找到就输出“OK!”,没找到就输出“error!”. Sample Input 10 1 2 3 4 5 6 7 8 9 10 5 Sample Input OK! 代码:#include<stdio.h>#include<mall

Bug2算法的实现(RobotBASIC环境中仿真)

移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不能看几遍就理解理论中的奥妙,只能在别人大谈XX理论XX算法的时候,自己一个人苦逼的面对错误的程序问为什么... 下面开始动手来实现一下简单的Bug2避障算法.由于算法中涉及到机器人与外界环境的交互,因此需要选择一个仿真软件.常用的移动机器人仿真软件主要有Gazebo.V-rep.Webots.MRD

万年历算法的实现(C语言--gcc编译)

/** cal.c * * 现行的格里历是从儒略历演化而来的.儒略历每4年一个润年,润年366天,平年365天.* 如果从公元1年算的话,那么凡是能够被4整除的都是润年.从天文角度看,儒略历这种 * 历法是有误差的,到16世纪误差已经达到了10天.1582年,罗马教皇对儒略历进行了 * 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再 * 算为润年,校定之后的儒略历即为现行的格里历. * * 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了1

搜索引擎--范例:中英文混杂分词算法的实现--正向最大匹配算法的原理和实现

纯中文和中英文混杂的唯一区别是,分词的时候你如何辨别一个字符是英文字符还是孩子字符, 人眼很容易区分,但是对于计算机来说就没那么容易了,只要能辨别出中文字符和英文的字符,分词本身就不是一个难题 1:文本的编码问题: utf8:windows下,以utf8格式保存的文本是一个3个字节(以16进制)的BOM的,并且你不知道一个汉字是否是用3位表示,但是英文适合ascii编码一样的 ascii:英文一位,中文两位,并且中文的第一个字节的值是大于128和,不会和英文混淆,推荐 unicode:中文基本是

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

软考笔记第六天之各排序算法的实现

对于前面的排序算法,用c#来实现 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中:依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程.直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1).直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位