实验8查找与排序算法的实现和应用
数据结构中查找和排序算法实验报告

for(i=ST.length; !EQ(ST.elem[i].key,key); --i);
return i;
}
3.归并排序算法描述如下:
merge(ListType r,int l,int m,int n,ListType &r2)
{
i=l;j=m+1;k=l-1;
sift(ListType &r,int k,int m)
{
i=k;j=2*i;x=r[k].key;finished=FALSE;
t=r[k];
while((j<=m)&&(!finished))
{
if ((j<m)&&(r[j].key>r[j+1].key)) j++;
if (x<=r[j].key)
将两个或两个以上的有序表组合成一个新的有序表的方法叫归并。
假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,如此重复。
4.堆排序分析:
只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。
什么是堆?n个元素的序列{k1,k2,...,kn}当且仅当满足下列关系时,称之为堆。关系一:ki<=k2i关系二:ki<=k2i+1(i=1,2,...,n/2)
静态查找表的顺序存储结构:
typedef struct {ElemType *e源自em;int length;
}SSTable;
顺序查找:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,查找不成功。
数据结构实验七、八 查找排序及其应用

实验七、八查找排序应用问题实现一、实验目的1.理解掌握动态查找表在计算机中的各种实现方法。
2.熟练掌握顺序查找、折半查找在顺序表上的实现及解决简单的应用问题。
3.熟练掌握常用排序算法在顺序表上的实现,能解决简单的应用问题。
二、实验内容⏹题目:从键盘上输入n个学生的基本信息(学号、姓名、班级、年龄等),建立其顺存储结构,然后执行如下操作:1、分别按学号、姓名、班级、年龄进行插入排序、交换排序和选择排序并显示排序结果(排序算法任选,但必须保证每种算法至少使用一次);2、可按学号、姓名、班级或其组合查找某一学生,若查找成功,则输出其基本信息,否则提示出错。
试设计程序完成上述功能。
提示:上述操作可用菜单方式实现,字符数据类型可用字符串比较函数strcmp (const char *, const char *) ,在string.h 头文件中测试数据:自定⏹设计要求:1、上机前,认真学习教材,理解掌握各种查找算法、排序算法的特点及在计算机中的实现方法2、上机前,认真独立地写出本次程序清单,流程图,该程序包括数据类型以及每一种操作的具体的函数定义和主函数。
有关算法分别参阅讲义和参考教材事例。
⏹头文件中数据结构设计及相关函数声明:#include<iostream.h>#include<string.h>#define MAXSIZE 20 //设记录不超过20个typedef struct { //学生数据结构体定义int Snumber; //学号char Name[10]; //姓名char Class[20]; //班级int Age; //年龄char Sex[10]; //性别}RecordType;typedef struct { //定义顺序表的结构RecordType r [ MAXSIZE +1 ]; //存储顺序表的向量int length ; //顺序表的长度}SqList ;void DataInput(SqList &L); //数据输入void DataPrint(SqList &L); //数据输出void InsertSort(SqList &L); //直接插入排序void QuickSort(SqList &L); //快速排序void SelectSort(SqList &L); //直接选择排序三、实验步骤(一)、数据结构与核心算法的设计描述根据实验题目及要求,宜采用顺序表的线性结构,实验中最重要的是三种排序算法的理解和实现,只有真正理解算法的内涵,才能熟练地应用,并解决相应的问题。
查找排序实验报告

查找排序实验报告一、实验目的本次实验的主要目的是深入理解和比较不同的查找和排序算法在性能和效率方面的差异。
通过实际编程实现和测试,掌握常见查找排序算法的原理和应用场景,为今后在实际编程中能够选择合适的算法解决问题提供实践经验。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
计算机配置为:处理器_____,内存_____,操作系统_____。
三、实验内容1、查找算法顺序查找二分查找2、排序算法冒泡排序插入排序选择排序快速排序四、算法原理1、顺序查找顺序查找是一种最简单的查找算法。
它从数组的一端开始,依次比较每个元素,直到找到目标元素或者遍历完整个数组。
其时间复杂度为 O(n),在最坏情况下需要遍历整个数组。
2、二分查找二分查找适用于已排序的数组。
它通过不断将数组中间的元素与目标元素进行比较,将查找范围缩小为原来的一半,直到找到目标元素或者确定目标元素不存在。
其时间复杂度为 O(log n),效率较高。
3、冒泡排序冒泡排序通过反复比较相邻的两个元素并交换它们的位置,将最大的元素逐步“浮”到数组的末尾。
每次遍历都能确定一个最大的元素,经过 n-1 次遍历完成排序。
其时间复杂度为 O(n^2)。
4、插入排序插入排序将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的合适位置。
其时间复杂度在最坏情况下为 O(n^2),但在接近有序的情况下性能较好。
5、选择排序选择排序每次从待排序数组中选择最小的元素,与当前位置的元素交换。
经过 n-1 次选择完成排序。
其时间复杂度为 O(n^2)。
6、快速排序快速排序采用分治的思想,选择一个基准元素,将数组分为小于基准和大于基准两部分,然后对这两部分分别递归排序。
其平均时间复杂度为 O(n log n),在大多数情况下性能优异。
五、实验步骤1、算法实现使用Python 语言实现上述六种查找排序算法,并分别封装成函数,以便后续调用和测试。
排序和查找的实验报告

排序和查找的实验报告实验报告:排序和查找引言排序和查找是计算机科学中非常重要的基本算法。
排序算法用于将一组数据按照一定的顺序排列,而查找算法则用于在已排序的数据中寻找特定的元素。
本实验旨在比较不同排序和查找算法的性能,并分析它们的优缺点。
实验设计为了比较不同排序算法的性能,我们选择了常见的几种排序算法,包括冒泡排序、插入排序、选择排序、快速排序和归并排序。
我们使用相同的随机数据集对这些算法进行了测试,并记录了它们的执行时间和占用空间。
在查找算法的比较实验中,我们选择了顺序查找和二分查找两种常见的算法。
同样地,我们使用相同的随机数据集对这些算法进行了测试,并记录了它们的执行时间和占用空间。
实验结果在排序算法的比较实验中,我们发现快速排序和归并排序在大多数情况下表现最好,它们的平均执行时间和空间占用都要优于其他排序算法。
而冒泡排序和插入排序则表现较差,它们的执行时间和空间占用相对较高。
在查找算法的比较实验中,二分查找明显优于顺序查找,尤其是在数据规模较大时。
二分查找的平均执行时间远远小于顺序查找,并且占用的空间也更少。
结论通过本实验的比较,我们得出了一些结论。
首先,快速排序和归并排序是较优的排序算法,可以在大多数情况下获得较好的性能。
其次,二分查找是一种高效的查找算法,特别适用于已排序的数据集。
最后,我们也发现了一些排序和查找算法的局限性,比如冒泡排序和插入排序在大数据规模下性能较差。
总的来说,本实验为我们提供了对排序和查找算法性能的深入了解,同时也为我们在实际应用中选择合适的算法提供了一定的参考。
希望我们的实验结果能够对相关领域的研究和应用有所帮助。
查找、排序的应用实验

淮海工学院计算机科学系实验报告书课程名:《数据结构》题目:查找、排序的应用实验班级:软件112学号:2011122635姓名:排序、查找的应用实验报告要求1目的与要求:1)查找、排序是日常数据处理过程中经常要进行的操作和运算,掌握其算法与应用对于提高学生数据处理能力和综合应用能力显得十分重要。
2)本次实验前,要求同学完整理解有关排序和查找的相关算法和基本思想以及种算法使用的数据存储结构;3)利用C或C++语言独立完成本次实验内容或题目,程序具有良好的交互性(以菜单形式列出实验排序和显示命令,并可进行交互操作)和实用性;4)本次实验为实验成绩评定主要验收内容之一,希望同学们认真对待,并按时完成实验任务;5)本次实验为综合性实验,请于2012年12月23日按时提交实验报告(纸质报告每班10份);6)下周开始数据结构课程设计,务必按时提交实验报告,任何同学不得拖延。
2 实验内容或题目题目:对记录序列(查找表):{287,109,063,930,589,184,505,269,008,083}分别实现如下操作:1)分别使用直接插入排序、冒泡排序、快速排序、简单选择排序、堆排序(可选)、链式基数排序算法对纪录序列进行排序,并显示排序结果;2)对上述纪录列表排好序,然后对其进行折半查找或顺序查找;3 实验步骤与源程序#include "stdio.h"#include "stdlib.h"#define LIST_SIZE 20#define TRUE 1#define FALSE 0typedef int KeyType;typedef struct{KeyType key;}RecordType;typedef struct{RecordType r[LIST_SIZE+1];int length;}RecordList;void seqSearch(RecordList *l){KeyType k; int i;printf("请输出要查询的元素k:");fflush(stdin);scanf("%d",&k);i=l->length;while (i>=0&&l->r[i].key!=k)i--;printf("该元素的位置是");printf("%d",i+1);//cout<<"该元素在图中第"<<i<<"个位置"<<endl; printf("\n");}void BinSrch(RecordList *l){KeyType q;int mid;printf("请输入要查询的元素k:");fflush(stdin);scanf("%d",&q);int low=1;int high=l->length;while(low<=high){mid=(low+high)/2;if(q==l->r[mid].key){printf("该元素的位置为:");printf("%d",mid+1);//注意不能随便使用&printf("\n");break;}else if(q<l->r[mid].key)high=mid-1;elselow=mid+1;}}void inputkey(RecordList *l){int i;printf("请输入线性表长度:");//遇到错误:1.print用法scanf("%d",&(l->length));//&将变量的地址赋值,而不是变量的值for(i=1;i<=l->length ;i++){printf("请输入第%d个元素的值:",i);fflush(stdin);scanf("%d",&(l->r[i].key));}}void InsSort(RecordList *l){for(int i=2;i<=l->length;i++){l->r[0].key=l->r[i].key;int j=i-1;while(l->r[0].key<l->r[j].key){l->r[j+1].key=l->r[j].key;j=j-1;}l->r[j+1].key=l->r[0].key;}}//直接插入排序void BubbleSort(RecordList *l){int x,i,n,change,j;n=l->length;change=TRUE;for(i=1;i<=n-1&&change;++i){change=FALSE;for(j=1;j<=n-i;++j)if(l->r[j].key>l->r[j+1].key){x=l->r[j].key;l->r[j].key=l->r[j+1].key ;l->r[j+1].key=x;change=TRUE;}}}//冒泡排序法int QKPass(RecordList *l,int left,int right) {int x;x=l->r[left].key ;int low=left;int high=right;while(low<high){while(low<high&&l->r[high].key>=x)high--;if(low<high){l->r[low].key=l->r[high].key;low++;}while(low<high&&l->r[low].key<=x)low++;if(low<high){l->r[high].key=l->r[low].key;high--;}}l->r[low].key=x;return(low);}void QKSort(RecordList *l,int low,int high){int pos;if(low<high){pos=QKPass(l,low,high);QKSort(l,low,pos-1);QKSort(l,pos+1,high);}}//快速排序void SelectSort(RecordList *l){int n,i,k,j,x;n=l->length;for(i=1;i<=n-1;++i){k=i;for(j=i+1;j<=n;++j)if(l->r[j].key<l->r[k].key) k=j;if(k!=i){x=l->r[i].key;l->r[i].key=l->r[k].key;l->r[k].key=x;} }}void output(RecordList *l){for(int i=1;i<=l->length;i++){printf("%d",l->r[i].key);printf("\n");}}void main(){RecordList *l,*t,*m,*n;l=(RecordList *)malloc(sizeof(RecordList));int low;int high;int flag=1;int xuanze;while(flag!=0){printf("####################################################\n");printf("###### 请选择你要进行的操作! #########\n");printf("###### 1.直接插入排序; #########\n");printf("###### 2.冒泡排序; #########\n");printf("###### 3.快速排序; #########\n");printf("###### 4.简单选择排序; #########\n");printf("###### 5.顺序查找; #########\n");printf("###### 6.折半查找; #########\n");printf("###### 7.退出! #########\n");printf("####################################################\n");scanf("%d",&xuanze);switch(xuanze){case 1:inputkey(l);InsSort(l);printf("直接插入排序结果是:\n");output(l);break;case 2:inputkey(l);BubbleSort(l);printf("冒泡排序结果是:\n");output(l);break;case 3:inputkey(l);low=1;high=l->length;QKSort(l,low,high);printf("快速排序结果是:\n");output(l);break;case 4:inputkey(l);SelectSort(l);printf("简单选择排序结果是:\n");output(l);break;case 5:inputkey(l);InsSort(l);printf("排序结果是:\n");output(l);seqSearch(l);break;case 6:inputkey(l);InsSort(l);printf("排序结果是:\n");output(l);break;BinSrch(l);case 7:flag=0;break;}}}4 测试数据与实验结果(可以抓图粘贴)《数据结构》实验报告- 10 -5 结果分析与实验体会1.编程时要细心,避免不必要的错误;2.要先熟悉书本上的内容,否则编译会有困难;3.不能太过死板,要灵活运用所学知识。
查找和排序实验报告

查找和排序实验报告
本实验主要针对以查找、排序算法为主要实现目标的软件开发,进行实验室研究。
实
验包括:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序,
以及折半查找算法。
实验采用C语言编写,在完成以上排序以及查找方法的基础上,针对实验的工程要求,进行了性能分析,分析了算法空间复杂度以及时间复杂度。
通过首先采用循环方式,构建未排序数组,在此基础上,调用算法实现查找和排序。
也对不同算法进行对比分析,将数据量在100个至30000个之间进行测试。
结果表明:快速排序与希尔排序在时间复杂度方面具有最好的表现,而冒泡排序和选
择排序时间复杂度较高。
在空间复杂度方面,基数排序表现最佳,折半查找的空间复杂度
则比较可观。
在工程应用中,根据对不同排序算法的研究,可以更准确、有效地选择正确的算法实现,有效应用C语言搭建软件系统,提高软件应用效率。
(建议加入算法图)
本实验结束前,可以得出结论:
另外,也可以从这些研究中发现,在使用C语言实现软件系统时,应该重视算法支持
能力,以提高软件应用效率。
由于查找和排序算法在软件应用中占有重要地位,此次实验
对此有贡献,可为未来开发提供支持。
数据结构实验查找和排序

查找、排序算法的应用班级学号姓名一、实验目的1 掌握查找的不同方法,并能用高级语言实现查找算法。
2 熟练掌握顺序表和有序表的顺序查找和二分查找方法。
3 掌握排序的不同方法,并能用高级语言实现排序算法。
4 熟练掌握顺序表的选择排序、冒泡排序和直接插入排序算法的实现。
二、实验内容1 创建给定的顺序表。
表中共包含八条学生信息,信息如下:学号姓名班级C++ 数据结构1 王立03511 85 762 张秋03511 78 883 刘丽03511 90 794 王通03511 75 865 赵阳03511 60 716 李艳03511 58 687 钱娜03511 95 898 孙胜03511 45 602 使用顺序查找方法,从查找表中查找姓名为赵阳和王夏的学生。
如果查找成功,则显示该生的相关信息;如果查找不成功,则给出相应的提示信息。
3 使用二分查找方法,从查找表中查找学号为7和12的学生。
如果查找成功,则显示该生的相关信息;如果查找不成功,则给出相应的提示信息。
(注意:创建静态查找表时必须按学号的从小到大排列!)4 使用直接插入排序方法,对学生信息中的姓名进行排序。
输出排序前和排序后的学生信息表,验证排序结果。
5 使用直接选择排序方法,对学生信息中的C成绩进行排序。
输出排序前和排序后的学生信息表,验证排序结果。
6 使用冒泡排序方法,对学生信息中的数据结构成绩进行排序。
输出排序前和排序后的学生信息表,验证排序结果。
7 编写一个主函数,将上面函数连在一起,构成一个完整程序。
8 将实验源程序调试并运行。
三、实验结果#include<iostream>#include<string>using namespace std;# define size 10struct student{string num;string name;string classnum;int cscore;int datascore;};struct seqlist{student stu[size];int len;};//创建顺序表void create_seq(seqlist &L){int n;cout<<"请输入学生的人数:";cin>>n;L.len=n;cout<<endl;cout<<"请输入学生信息:"<<endl;cout<<"学号"<<" "<<"姓名"<<" "<<"班级"<<" "<<"C++成绩"<<" "<<"数据结构成绩"<<endl;for(int i=1;i<=L.len;i++ ){cin>>L.stu [i].num >>L.stu [i].name >>L.stu[i].classnum >>L.stu[i].cscore >>L.stu [i].datascore ;}}//输出顺序表的信息void display(seqlist L){cout<<"学号"<<" "<<"姓名"<<" "<<"班级"<<" "<<"C++成绩"<<" "<<"数据结构成绩"<<endl;for(int i=1;i<=L.len;i++){cout<<L.stu [i].num<<" "<<L.stu [i].name<<" "<<L.stu [i].classnum <<" "<<L.stu [i].cscore <<" "<<L.stu [i].datascore <<endl;}cout<<endl;}//顺序查找void seq_search(seqlist L,string n){int i=1;while(i<=L.len &&L.stu [i].name !=n){ i++;}if(i>L.len ){cout<<"该生不存在"<<endl;return;}cout<<L.stu [i].num<<" "<<L.stu [i].name<<" "<<L.stu [i].classnum <<" "<<L.stu [i].cscore <<" "<<L.stu [i].datascore <<endl;}//折半查找void bin_search(seqlist L,string n){int low,high,mid;low=1;high=L.len ;while(low<=high){mid=(low+high)/2;if(L.stu[mid].num==n){cout<<L.stu [mid].num<<" "<<L.stu [mid].name<<" "<<L.stu [mid].classnum <<" "<<L.stu [mid].cscore <<" "<<L.stu [mid].datascore <<endl; return;}else if(n<L.stu [mid].num){high=mid-1;}else{low=mid+1;}}cout<<"该学生不存在"<<endl;}//直接选择排序void selectsort(seqlist L){int k;student temp;for(int i=1;i<=L.len -1;i++){k=i;for(int j=i+1;j<=L.len;j++){if(L.stu[j].cscore<L.stu[k].cscore)k=j;}if(k!=i){temp=L.stu [i] ;L.stu [i] =L.stu [k] ;L.stu [k] =temp;}}display(L);}void bubblesort(seqlist L){int i,j,flag=1;student w;for(i=1;(i<=L.len -1)&&(flag);i++){flag=0;for(j=L.len ;j>=i+1;j--)if(L.stu [j].datascore <L.stu [j-1].datascore ){w=L.stu [j];L.stu [j]=L.stu [j-1];L.stu [j-1]=w;flag=1;}}display(L);}void insertsort2(seqlist L){int i, j;for( i=2; i<=L.len; i++ )if (L.stu[i].name< L.stu[i-1].name){L.stu[0]=L.stu[i]; // 复制为哨兵for(j=i-1; L.stu[0].name<L.stu[j].name; j-- )L.stu[j+1]=L.stu[j]; // 记录后移L.stu[j+1]=L.stu[0]; // 插入到正确位置}cout<<"排序后学生的信息如下:"<<endl;display(L);}void main(){seqlist L;cout<<"创建顺序表"<<endl;create_seq(L);cout<<"输出顺序表"<<endl;display(L);cout<<"顺序查找"<<endl;seq_search(L,"赵阳");seq_search(L,"王夏");cout<<"折半查找"<<endl;bin_search(L,"7");bin_search(L,"12");cout<<"直接插入排序"<<endl;insertsort2(L);cout<<"直接选择排序"<<endl;selectsort(L);cout<<"冒泡排序"<<endl;bubblesort(L);}执行结果如下:四、实验总结1.对于String 类的应用时要用using namespace std; 而不能直接用<Sting.h>,那样总是说前面少一个分号。
查找排序实验报告总结

一、实验目的本次实验旨在通过编写程序实现查找和排序算法,掌握基本的查找和排序方法,了解不同算法的优缺点,提高编程能力和数据处理能力。
二、实验内容1. 查找算法本次实验涉及以下查找算法:顺序查找、二分查找、插值查找。
(1)顺序查找顺序查找算法的基本思想是从线性表的第一个元素开始,依次将线性表中的元素与要查找的元素进行比较,若找到相等的元素,则查找成功;若线性表中所有的元素都与要查找的元素进行了比较但都不相等,则查找失败。
(2)二分查找二分查找算法的基本思想是将待查找的元素与线性表中间位置的元素进行比较,若中间位置的元素正好是要查找的元素,则查找成功;若要查找的元素比中间位置的元素小,则在线性表的前半部分继续查找;若要查找的元素比中间位置的元素大,则在线性表的后半部分继续查找。
重复以上步骤,直到找到要查找的元素或查找失败。
(3)插值查找插值查找算法的基本思想是根据要查找的元素与线性表中元素的大小关系,估算出要查找的元素应该在大致的位置,然后从这个位置开始进行查找。
2. 排序算法本次实验涉及以下排序算法:冒泡排序、选择排序、插入排序、快速排序。
(1)冒泡排序冒泡排序算法的基本思想是通过比较相邻的元素,将较大的元素交换到后面,较小的元素交换到前面,直到整个线性表有序。
(2)选择排序选择排序算法的基本思想是在未排序的序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到所有元素均排序完毕。
(3)插入排序插入排序算法的基本思想是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增加1的有序表。
(4)快速排序快速排序算法的基本思想是选择一个元素作为基准元素,将线性表分为两个子表,一个子表中所有元素均小于基准元素,另一个子表中所有元素均大于基准元素,然后递归地对两个子表进行快速排序。
三、实验结果与分析1. 查找算法通过实验,我们发现:(1)顺序查找算法的时间复杂度为O(n),适用于数据量较小的线性表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
陕西科技大学实验报告班级学号姓名实验组别实验日期室温报告日期成绩报告内容:(目的和要求、原理、步骤、数据、计算、小结等)实验名称:查找与排序算法的实现和应用实验目的:1. 掌握顺序表中查找的实现及监视哨的作用。
2. 掌握折半查找所需的条件、折半查找的过程和实现方法。
3. 掌握二叉排序树的创建过程,掌握二叉排序树查找过程的实现。
4. 掌握哈希表的基本概念,熟悉哈希函数的选择方法,掌握使用线性探测法和链地址法进行冲突解决的方法。
5. 掌握直接插入排序、希尔排序、快速排序算法的实现。
实验环境(硬/软件要求):Windows 2000,Visual C++ 6.0实验内容:通过具体算法程序,进一步加深对各种查找算法的掌握,以及对实际应用中问题解决方法的掌握。
各查找算法的输入序列为:26 5 37 1 61 11 59 15 48 19输出要求:查找关键字37,给出查找结果。
对于给定的某无序序列,分别用直接插入排序、希尔排序、快速排序等方法进行排序,并输出每种排序下的各趟排序结果。
各排序算法输入的无序序列为:26 5 37 1 61 11 59 15 48 19。
实验要求:一、查找法1. 顺序查找首先从键盘输入一个数据序列生成一个顺序表,然后从键盘上任意输入一个值,在顺序表中进行查找。
2. 折半查找任意输入一组数据作为个数据元素的键值,首先将此序列进行排序,然后再改有序表上使用折半查找算法进对给定值key 的查找。
3. 二叉树查找任意输入一组数据作为二叉排序树中节点的键值,首先创建一颗二叉排序树,然后再次二叉排序树上实现对一定k的查找过程。
4. 哈希表查找任意输入一组数值作为个元素的键值,哈希函数为Hash (key )=key%11, 用线性探测再散列法解决冲突问题。
二、排序算法编程实现直接插入排序、希尔排序、快速排序各算法函数;并编写主函数对各排序函数进行测试。
实验原理:1. 顺序查找:在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。
原理是让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺点是效率低下。
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
2•哈希查找:哈希查找的操作步骤:⑴用给定的哈希函数构造哈希表;⑵根据选择的冲突处理方法解决地址冲突;⑶在哈希表的基础上执行哈希查找。
哈希查找的本质是先将数据映射成它的哈希值。
哈希查找的核心是构造一个哈希函数,它将原来直观、整洁的数据映射为看上去似乎是随机的一些整数。
哈希查找的产生有这样一种背景一一有些数据本身是无法排序的(如图像),有些数据是很难比较的(如图像)。
如果数据本身是无法排序的,就不能对它们进行比较查找。
如果数据是很难比较的,即使采用折半查找,要比较的次数也是非常多的。
因此,哈希查找并不查找数据本身,而是先将数据映射为一个整数(它的哈希值),并将哈希值相同的数据存放在同一个位置一即以哈希值为索引构造一个数组。
在哈希查找的过程中,只需先将要查找的数据映射为它的哈希值,然后查找具有这个哈希值的数据,这就大大减少了查找次数。
如果构造哈希函数的参数经过精心设计,内存空间也足以存放哈希表,查找一个数据元素所需的比较次数基本上就接近于一次。
3.排序算法:排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或流程图:输入查找条件用户输入输出结果记录)的任意序列,重新排列成一个关键字有序的序列。
排序创建二叉树是否继续中序遍历实验代码:一、查找法1、顺序查找#i nclude <stdio.h>#defi ne MAX 100typedef int keytype;typedef struct{ keytype key;}elemtype;typedef struct{ elemtype elem[MAX+1];int len gth;}SStable;void create_seq(SStable*list);int seq_search(SStable*list,keytype k);void mai n(){ SStable *list,table;keytype key;int i;list=& table;printf("请输入顺序表的长度:"); scan f("%d",&list->le ngth); create_seq(list);printf("创建的顺序表内容:\n");for(i=0;i<list->length;i++) printf("list.elem[%d].key=%d\n",i+1,list->elem[i].key);printf("输入查找关键字:");scanf("%d",&key);seq_search(list,key);}void create_seq(SStable *list){ int i;printf("请输入顺序表的内容:\n"); for(i=0;i<list->length;i++){ printf("list.elem[%d].key=",i+1);scanf("%d",&list->elem[i].key);}}int seq_search(SStable*list,keytype k){ int i=0,flag=0;while(i<list->length){ if(list->elem[i].key==k){ printf("查找成功.\n");flag=1; printf("list.elem[%d].key=%d\n",i+1,k);}i++;}if(flag==0)printf("没有找到数据%d!\n",k);return(flag);}2、折半查找#include<stdio.h>#define MAX 100typedef struct{ int elem[MAX+1];int length;}Stable;void creat_seq(Stable*list);int sort_seq(Stable*list);int bin_search(Stable*list,int k,int low,int higt);void main(){ Stable *list,table;int i,key;list=&table;printf("请输入线性表的长度:"); scanf("%d",&list->length);creat_seq(list);sort_seq(list);printf("排列后的数据\n"); for(i=1;i<=list->length;i++)printf("list.elem[%d].key=%d\n",i,list->elem[i]); printf("\n 请输入查找的值:");scanf("%d",&key); bin_search(list,key,1,list->length);}void creat_seq(Stable*list){ int i;printf("请输入顺序表的内容:\n"); for(i=1;i<=list->length;i++){printf("list.elem[%d].key=",i);scanf("%d",&list->elem[i]);}}int sort_seq(Stable*list){ int i,j,flag;for(i=1;i<list->length;i++){flag=0;for( j=1;j<list->length-i+1;j++)if (list->elem[j]>list->elem[j+1]) {list->elem[0]=list->elem[ j+1];list->elem[j+1]=list->elem[j]; list->elem[j]=list->elem[0];flag=1;}if(flag==0)return 1;}}int bin_search(Stable*list,int k,int low,int high) { int mid;if(low>high){ printf("没有找到要查找的值\n");return(0);}mid=(low+high)/2;if(list->elem[mid]==k){ printf("查找成功\n"); printf("list[%d]=%d\n",mid,k);return(mid);}elseif(list->elem[mid]<k)return(bin_search(list,k,mid+1,high));else return(bin_search(list,k,low,mid-1));}3、二叉树查找#include <stdio.h>#include <stdlib.h>typedef struct bitnode{int key;struct bitnode *lchild;struct bitnode *rchild;}bnode;void ins_bitree(bnode *p,int k){bnode *q;if(p->key >k&&p->lchild)ins_bitree(p->lchild,k);elseif(p->key<=k&&p->rchild)ins_bitree(p->rchild,k);else{q=(bnode *)malloc(sizeof(bnode)); q->key=k;q->lchild=NULL;q->rchild=NULL;if(p->key>k)p->lchild=q;elsep->rchild=q;}}void bit_search(bnode *p,int k){if(p->key>k&&p->lchild) bit_search(p->lchild,k);elseif(p->key<k&&p->rchild)bit_search(p->rchild,k);else if(p->key ==k) printf("查找成功!\n");else printf("%d 不存在!\n");}void inorder(bnode *p){if(p){inorder(p->lchild); printf("%4d",p->key); inorder(p->rchild);}}void main (){ int k;bnode *p;0 结束 :\n");p=NULL;printf("请输入二叉树结点的值,输入 scanf("%d",&k);p=(bnode *)malloc(sizeof(bnode)); p->key=k; p->lchild=NULL; p->rchild=NULL; scanf("%d",&k); while (k>0){ins_bitree(p,k); scanf("%d",&k);}printf("\n");printf("二叉树排序的结果 :"); inorder(p);printf("\n 请输入查找的值 :\n"); scanf("%d",&k); bit_search(p,k);}4 、哈希表查找#include <stdio.h> #define MAX 11 void ins_hash(int hash[],int key)infkKk N kukey%MA><=h (h a s h -k ll H O )宀hash-kHkey八recrn八e-se宁」H k +rwh=e(ldA M A X QO QO h a s h_l d 70)k」++=h (k」A M A X )宀hash-klHkey八recrn八k2uaw h i _e (k 2A kQO QO h a s h -k 270)k 2++=h(k 2A k )hash-k2llkey 八recrn八voidouflhash(infhash=)宀5'二f o r (ll'o xM A X _.++)=h(hash三)prinff(=hash-%dll%2n=Lhashe-voidhashlsearch(infhash-Linfkey)宀infk-kl>2J-aguo八kukey%MA>< if(hash-kHukey)宀prinff(=hash-%dH%d=Kkey)八f_agun,凹>#嬴潯■\n");else{k1=k+1;while(k1<MAX&&hash[k1]!=key) k1++; if(k1<MAX){printf("hash[%d]=%d",k1,key); flag=1;} k2=0; if(!flag){while(k2<k&&hash[k2]!=key) k2++; if(k2<k){printf("hash[%d]=%d",k2,key); flag=1;}}if(flag){printf("查找成功! \n"); return; }else{printf("查找失败! \n"); return;}} }void main(){int i,key,k,sum=0;int hash[MAX]; for(i=0;i<MAX;i++) hash[i]=0;printf("请输入数据,以 0 结束: scanf("%d",&key); sum++;while(key&&sum<MAX) {ins_hash(hash,key); scanf("%d",&key); sum++;}printf("\n"); out_hash(hash); printf("\n");printf("请输入查找的值: "); scanf("%d",&k); hash_search(hash,k);printf("\n");}二、排序算法#include<stdio.h> #include<time.h> #define size 11 typedef char datatype;typedef struct{int key;datatype others;}rectype;void INSERTSORT(rectype R[]){ int i,j;for (i=2;i<=size;i++){ R[0]=R[i];j=i-1;while (R[0].key<R[j].key){ R[ j+1]=R[j];j--;}R[ j+1]=R[0];}}void SHELLSORT(rectype R[],int n) {int i,j,h;rectype temp; h=n/2;while(h>0) {for(j=h;j<=n-1;j++) {temp=R[ j]; i=j-h;while ((i>=0)&&temp.key<R[i].key) {R[i+h]=R[i];i=i-h;}R[i+h]=temp;} h=h/2;} } int PARTITION(rectype R[],int l,int h) {int i,j;rectype temp; i=1;j=h;temp=R[i]; do{while ((R[j].key>=temp.key)&&(i<j)) j--;if(i<j)R[i++]=R[j];while ((R[i].key<=temp.key)&&(i<j)) i++;if(i<j) R[ j--]=R[i];}while(i!=j);R[i]=temp;return i;}void QUICKSORT(rectype R[],int s1,int t1){ int i;if(s1<t1){ i=PARTITION(R,s1,t1);QUICKSORT(R,s1,i-1);QUICKSORT(R,i+1,t1);}}void main(){ rectype R[size];int i;printf("请输入使用插入算法排序的10 个数据\n");for(i=1;i<size;i++) scanf("%d",&R[i].key);printf("\n 插入排序之前\n");for(i=1;i<size;i++)printf("%d\t",R[i].key) ;INSERTSORT(R);printf("\n 插入排序之后\n"); for(i=1;i<size;i++) printf("%d\t",R[i].key); printf("\n 请输入使用希尔顿算法排序的10 个数据\n"); for(i=0;i<size-1;i++)scanf("%d",&R[i].key);printf("\n 希尔排序之前\n");for(i=0;i<size-1;i++) printf("%d\t",R[i].key);SHELLSORT(R,10);printf("\n 希尔排序之后\n"); for(i=0;i<size-1;i++) printf("%d\t",R[i].key); printf("请输入使用快速算法排序的10 个数据\n"); for(i=1;i<size;i++)scanf("%d",&R[i].key);printf("\n 快速排序之前\n");for(i=1;i<size;i++) printf("%d\t",R[i].key);QUICKSORT(R,1,10);printf("\n 快速排序之后\n");for(i=1;i<size;i++) printf("%d\t",R[i].key);}实验结果顺序查找:折半查找: 二叉树查找: 哈希表查找:通过本次实验,我实验小结:此次操作证明可以用编程实现查找与排序,实验结果正确。