查找和排序算法的实现(实验七)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七查找和排序算法的实现
•实验目的及要求
(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 { scanf("%d",&L.r[i].key); } } int Search(SSTable L,int elem) { if(L.r[L.length-1].key { 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(" else if(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 { 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 1 typedef 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 { scanf("%d",&L.r[i].key); } return OK; } Status Insertsort(SqList &L) { for(int i=2;i { L.r[0]=L.r[i];// 交换的应该是该位置记录的完整数据项,而不仅仅是数据项中的一个key for(i nt j=i;j>0&&L.r[0].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 { }