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

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

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

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

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

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

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

程序代码:折半查找:头文件:#defi ne EQ(a,b) ((a)==(b))#define LT(a,b) ((a)v(b))#defi ne maxle ngth 20 typedef int ElemType;typedef struct{ElemType key;ElemType other;}card;〃每条记录包含的数据项typedef struct{card r[maxle ngth];int len gth;}SSTable;〃一张表中包含的记录容量void Create(SSTable & L); int Search(SSTable L,i nt elem);功能函数:#i nclude"1.h" #i nclude"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(" elseif(LT(elem,L.r[mid].key)){high=mid-1;}else{low=mid+1;}}printf(" 表中没有该元素(不在范围内)return 0;}主函数:#include"stdio.h"#include"1.h" int main() {该元素在第%d 位\n",mid+1); return 0;} \n");SSTable L;Create(L);prin tf("\n");printf("此时的线性表元素:\n");for(i nt a=0;a<L .len gth;a++){prin tf("%d "丄.r[a].key);}prin tf("\n");prin tf("\n");int elem;do{printf("请输入要查找的元素(输入000表示结束程序)\n");sea nf("%d", &elem);if(elem!=000){Seareh(L,elem);}}while(elem!=000);return 0;}运行结果:(2)编程实现一种内部排序算法(如插入排序、快速排序等)。

程序代码部分:直接插入排序头文件:#defi ne maxle ngth 20/最大数据容量#defi ne OK 1typedef int Other;typedef int KeyType;typedef int Status;typedef struct{KeyType key;Other data;}Red;typedef struct{Red r[maxle ngth+1];〃加了个哨兵的位置int len gth;//当前数据个数}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(i nt 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 Other;typedef int KeyType;typedef struct{KeyType key;Other data;}Red;typedef struct{Red r[maxle ngth+1];〃加了个哨兵的位置int len gth;//当前数据个数}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"); typedef int Status;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(" 请输入无序子列的开始和结束位置(有序子列不用管) int\n");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分)不及格。

相关主题