当前位置:文档之家› 查找和排序算法的实现(实验七)

查找和排序算法的实现(实验七)

实验七查找和排序算法的实现一.实验目的及要求(1)学生在实验中体会各种查找和内部排序算法的基本思想、适用场合,理解开发高效算法的可能性和寻找、构造高效算法的方法。

(2)掌握运用查找和排序解决一些实际应用问题。

二.实验内容:(1)编程实现一种查找算法(如折半查找、二叉排序树的查找、哈希查找等),并计算相应的ASL。

(2)编程实现一种内部排序算法(如插入排序、快速排序等)。

三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现一种查找算法(如折半查找、二叉排序树的查找、哈希查找等),并计算相应的ASL。

➢程序代码:折半查找:头文件:#define EQ(a,b) ((a)==(b))#define LT(a,b) ((a)<(b))#define maxlength 20typedef int ElemType;typedef struct{ElemType key;ElemType other;}card;//每条记录包含的数据项typedef struct{card r[maxlength];int length;}SSTable;//一张表中包含的记录容量void Create(SSTable &L);int Search(SSTable L,int elem);功能函数:#include"1.h"#include"stdio.h"void Create(SSTable &L){printf("新的线性表已经创建,请确定元素个数(不超过20)\n");scanf("%d",&L.length);printf("请按递增序列输入具体的相应个数的整数元素(空格隔开)\n");for(int i=0;i<L.length;i++){scanf("%d",&L.r[i].key);}}int Search(SSTable L,int elem){if(L.r[L.length-1].key<elem||L.r[0].key>elem){printf("表中没有该元素(不在范围内)\n");return 0;}int low=0,high=L.length-1;int mid;while(low<=high){mid=(low+high)/2;if(EQ(L.r[mid].key,elem)){printf("该元素在第%d位\n",mid+1); return 0;}else if(LT(elem,L.r[mid].key)){high=mid-1;}else{low=mid+1;}}printf("表中没有该元素(不在范围内)\n");return 0;}主函数:#include"stdio.h"#include"1.h"int main(){SSTable L;Create(L);printf("\n");printf("此时的线性表元素:\n");for(int a=0;a<L.length;a++){printf("%d ",L.r[a].key);}printf("\n");printf("\n");int elem;do{printf("请输入要查找的元素(输入000表示结束程序)\n");scanf("%d",&elem);if(elem!=000){Search(L,elem);}}while(elem!=000);return 0;}➢运行结果:(2)编程实现一种内部排序算法(如插入排序、快速排序等)。

程序代码部分:直接插入排序头文件:#define maxlength 20//最大数据容量#define OK 1typedef int Status;typedef int Other;typedef int KeyType;typedef struct{KeyType key;Other data;}Red;typedef struct{Red r[maxlength+1];//加了个哨兵的位置int length;//当前数据个数}SqList;Status Init(SqList &L);Status Insertsort(SqList &L);功能函数:#include"stdio.h"#include"1.h"Status Init(SqList &L){printf("新的线性表以创建,请确定元素个数(不超过20)\n");scanf("%d",&L.length);printf("请输入具体的相应个数的整数元素(空格隔开)\n");for(int i=1/*将哨兵的位置【0】空出来*/;i<L.length+1;i++){scanf("%d",&L.r[i].key);}return OK;}Status Insertsort(SqList &L){for(int i=2;i<L.length+1;i++){L.r[0]=L.r[i];//交换的应该是该位置记录的完整数据项,而不仅仅是数据项中的一个keyfor(int j=i;j>0&&L.r[0].key<L.r[j-1].key/*这里是依据记录中的数据项key来排序的,所以比较的是key,而不是一条记录的所有数据项*/;j--){L.r[j]=L.r[j-1];}L.r[j]=L.r[0];}return OK;}主函数:#include"stdio.h"#include"1.h"int main(){SqList L;Init(L);printf("\n");printf("排序前的线性表元素:\n");for(int a=1;a<L.length+1;a++){printf("%d ",L.r[a].key);}printf("\n");printf("\n");Insertsort(L);printf("排序后的线性表元素:\n");for(int b=1;b<L.length+1;b++){printf("%d ",L.r[b].key);}printf("\n");return 0;}快速排序头文件:#define maxlength 20//最大数据容量#define OK 1typedef int Status;typedef int Other;typedef int KeyType;typedef struct{KeyType key;Other data;}Red;typedef struct{Red r[maxlength+1];//加了个哨兵的位置int length;//当前数据个数}SqList;void Init(SqList &L);Status Partition(SqList &L,int low,int high);void QSort(SqList &L,int low,int high);功能函数:#include"stdio.h"#include"1.h"void Init(SqList &L){printf("新的线性表以创建,请确定元素个数(不超过20)\n");scanf("%d",&L.length);printf("请输入具体的相应个数的整数元素(空格隔开)\n");for(int i=1/*将存放枢轴中关键字所在记录完整信息的位置【0】空出来*/;i<L.length+1;i++){scanf("%d",&L.r[i].key);}}Status Partition(SqList &L,int low,int high){int pivotkey;pivotkey=L.r[low].key;//用第一条记录的关键字作枢轴L.r[0]=L.r[low];//存放作为枢轴的关键字所在记录的完整信息while(low<high){while(low<high&&L.r[high].key>=pivotkey){high--;}//从右端往左L.r[low]=L.r[high];while(low<high&&L.r[low].key<=pivotkey){low++;}//从左端往右L.r[high]=L.r[low];}L.r[low]=L.r[0];return low;}void QSort(SqList &L,int low,int high){int pivotloc;if(low<high){pivotloc=Partition(L,low,high);QSort(L,low,pivotloc-1);QSort(L,pivotloc+1,high);}}主函数:#include"stdio.h"#include"1.h"int main(){SqList L;Init(L);printf("\n");printf("排序前的线性表元素:\n");for(int a=1;a<L.length+1;a++){printf("%d ",L.r[a].key);}printf("\n");printf("\n");printf("请输入无序子列的开始和结束位置(有序子列不用管)\n");int low,high;scanf("%d %d",&low,&high);QSort(L,low,high);printf("排序后的线性表元素:\n");for(int b=1;b<L.length+1;b++){printf("%d ",L.r[b].key);}printf("\n");return 0;➢运行结果:四.实验结果的分析与评价(该部分如不够填写,请另加附页)1.快速排序利用了递归的思想;2.折半查找使用前提为:数列有序注:实验成绩等级分为(90-100分)优,(80-89分)良,(70-79分)中,(60-69分)及格,(59分)不及格。

相关主题