查找和排序算法的实现 (实验七)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七查找和排序算法的实现
一.实验目的及要求
(1)学生在实验中体会各种查找和部排序算法的基本思想、适用场合,理解开发高效算法的可能性和寻找、构造高效算法的方法。
(2)掌握运用查找和排序解决一些实际应用问题。
二.实验容:
(1)编程实现一种查找算法(如折半查找、二叉排序树的查找、哈希查找等),并计算相应的ASL。
(2)编程实现一种部排序算法(如插入排序、快速排序等)。
三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)
(1)编程实现一种查找算法(如折半查找、二叉排序树的查找、哈希查找等),并计算相应的ASL。
➢程序代码:
折半查找:
头文件:
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define maxlength 20
typedef 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 { 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("该元素在第%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 { 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 1 typedef 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 { 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(int j=i;j>0&&L.r[0].key { L.r[j]=L.r[j-1]; } L.r[j]=L.r[0]; } return OK;