综合算法设计实验报告 精品Word文件下载.docx
- 文档编号:14782590
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:26
- 大小:291.54KB
综合算法设计实验报告 精品Word文件下载.docx
《综合算法设计实验报告 精品Word文件下载.docx》由会员分享,可在线阅读,更多相关《综合算法设计实验报告 精品Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
7)掌握选择排序中堆排序的基本思想和算法实现
8)掌握快速排序的基本思想和算法实现
9)了解归并排序算法的基本思想和程序实现
10)了解基数排序算法的基本思想和程序实现
11)掌握Hash排序算法的基本思想和程序实现
12)在上述内容的基础上,将所有查找及排序算法整合在一个程序中
2、实验基本原理与方法
本实验涉及各类查找和排序算法。
静态查找,折半查找的思想为:
设查找表中的元素存放在数组r中,数据元素的下标范围为[low,high],要查找的关键字值为key,中间元素的下标为mid=|_(low+high)/2_|(向下取整),令key与r[mid]的关键字比较:
1若key=r[mid].key,查找成功,下标为m的记录即为所求,返回mid。
2若key<
r[mid].key,所要找的记录只能在左半部分记录中,再对左半部分使用折半查找法继续进行查找,搜索区间缩小了一半。
3若key>
r[mid].key,所要找的记录只能在右半部分记录中,再对右半部分使用折半查找法继续进行查找,搜索区间缩小了一半。
重复上述过程,直到找到查找表中某一个数据元素的关键字的值等于给定的值key,说明查找成功;
或者出现low的值大于high的情况,说明查找不成功。
动态查找,编程实现一个开放式的高校本科招生最低录取分数线的查询系统,供师生和家长等查询,高校自愿放入该校的信息,可能随时有高校加入。
要求实现的查询功能有:
①查询等于用户给定分数的高校;
②查询大于(或小于)用户给定分数的高校③查询最低录取分数线在用户给定的分数段中的高校。
直接插入排序:
将当前无序区的第一个记录插入到有序区中适当位置。
折半查找法:
在有序表中进行,先确定表的中点位置,再通过比较确定下一步查找哪个半区。
Shell排序:
先取定一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,所有距离为d1倍数的记录放在同一个组中,在各组内进行直接插入排序;
然后取第二个增量重复上述分组和排序,直至所取的增量dt=1(dt<
dt-1<
…<
d2<
d1),即所有记录放在同一组中进行直接插入排序为止。
堆排序是利用大顶堆(或小顶堆)来选取当前无序区中关键字最大(或最小)的记录实现排序
快速排序是对冒泡法的改进,其基本思想是:
通过一趟排序将待排文件分割成独立的两部分,其中一部分记录的关键字值均比另一部分记录的关键字小,然后分别对这两部分进行排序,以达到整个序列有序。
归并的思想:
将两个或两个以上的有序表合并成一个有序表。
利用归并的思想实现排序,假设初始的序列含有n个记录,可以看成n个有序的子序列,每个子序列的长度为m,然后把i(≥2)个子序列归并,得到n/i个长度为i的子序列;
再继续归并,如此重复直到得到一个长度为n的有序序列为止。
通常使用的是i=2的二路归并法。
基数排序的基本思想是采用多关键字的排序。
设记录关键字R[i]由d个分量ki1,ki2,…,kid组成,设每个分量的取值范围为{ti|i=1,2,…,m,且t1<
t2<
tm}。
准备m个箱子,先按低位分箱再按序号一次将各个非空箱子里的记录收集起来,再对新收集起来的元素依次按较高的位分箱,直到最高位。
分箱即将第s个关键字等于ti的全部记录装入第i个箱子里。
按最高位分箱后,按序号一次将各个非空箱子里的记录收集起来,得到的元素序列就是有序的。
Hash排序是在Hash查找的基础上演变而来。
对待排序列采用单调的Hash函数,并用链地址法处理冲突,最后用一定规则收集存储好的数据从而得到有序序列。
3、主要仪器设备及耗材
安装有VC++6.0运行环境的电脑,无耗材要求。
4、实验方案或技术路线
本实验含有五部分内容——静态查找、动态查找、插入排序与选择排序、快速排序与归并排序、查找及排序算法集成。
A.静态查找部分
查找表的存储结构为有序表,即表中记录按关键字大小排序存放。
输入待查数据元素的关键字进行查找。
为了简化算法,记录只含一个整型量关键字字段,记录的其余数据部分忽略不考虑。
此程序中要求对整型量关键字数据的输入按从小到大排序输入。
B.动态查找部分
主要的功能是查找,查找表为高校最低录取分数信息的集合。
根据题意可知,该查找表中的元素个数可能随时增减,所以它是一个动态查找表,可采用树状结构保存。
为了提高查询速度,可建立二叉排序树并在二叉排序树中实现查找。
C.排序部分
考虑对20个整数的随机输入进行排序,各排序功能基本上都可以成为独立调用的模块,因此可以先写出排序算法,然后用主函数调用。
D.查找及排序算法集成部分
此部分需要学生自行设计,本指导书不给出具体算法。
第二部分:
实验过程记录
实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)
1.概要设计(说明本程序中用到的所有抽象数据类型的定义,主程序的流程以及各程序模块之间的层次或调用关系)
1.1抽象数据类型:
队列:
ADTQueue{数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,...,n}基本操作:
voidinit_Q(Queue&
Q);
操作结果:
构造空队列QintQ_empty(QueueQ);
初始条件:
队列Q存在操作结果:
若Q为空队列,则返回TRUE,否则FALSEintQ_length(QueueQ);
返回队列Q的元素个数,即队列长度intgethead_Q(QueueQ);
返回队列Q的队头元素voiden_Q(Queue&
Q,inte);
插入元素e为Q的新的队尾元素。
voidde_Q(Queue&
Q,int&
e);
删除Q的队头元素。
}ADTQueue
线性表:
ADTList
{
数据对象:
D={ai|1<
=i<
=n,n>
=o,ai属于elementtype类型}
数据关系:
R={<
ai,ai+1>
|ai,ai+1属于D,i=1,...,n-1}
基本运算:
InitList(&
l)
DestroyList(&
l);
......
}
图:
ADTGraph
数据对象:
=0,ai属于ELEMTYPE类型}
类型标识符
R={<
ai,aj>
|ai,aj属于D,1<
=n,1<
=j<
=n,其中每个元素可以有零个或多个直接前驱,可以有多个直接后继}
InitGraph(&
g)
ClearGraph(&
DFS(g)
BFS(g)
.
1.2小问题:
A.随机数的产生:
srand()函数用于设置随机数种,rand()用于产生一个随机数。
B.数据的储存:
由于100000个int型数的数组,所以我采用了malloc()函数来动态分配一数组存储它。
对于一些特别大的数据可以用文件存储,在采用外排序的方式排序。
C.屏幕上无法显示100000条数据,故将数据存储在两个文本文件中。
一个是没排好序的,另一个是排好序后的数据。
1.3主要数据结构设计:
归并排序:
typedefintKeyType;
typedefintDataType;
typedefstruct
{KeyTypekey;
/*排序码字段*/
/*DataTypeinfo;
记录的其它字段*/}RecordNode;
{intn;
/*n为文件中的记录个数,n<
MAXNUM*/
RecordNoderecord[MAXNUM];
}SortObject;
基数排序:
typedefstructNodeRadixNode;
structNode
{KeyTypekey[D];
/*DataTypeinfo;
*/
RadixNode*next;
};
typedefRadixNode*RadixList;
typedefstructQueueNode
{RadixNode*f;
/*队列的头指针*/
RadixNode*e;
/*队列的尾指针*/
}Queue;
Hash排序:
typedefstructhnode
{intdata;
structhnode*next;
}HNODE;
typedefstructpoint
{structhnode*pt;
}POINT;
1.4主程序流程:
主程序main()
输入随机数种子
产生随机数,并存在nonqueue.txt文件中
选择排序方法
7.哈希
6.基数
5.归并
4.快速
3.堆
2.希尔
1.折半
选择排序方法,并存在queue.txt文件中
退出程序
主函数在main.cpp中,排序算法的在各自的头文件中。
选择排序方法后,调用选择的排序方法。
1.5各函数调用关系:
rand()
BinsertSort()
ShellInsert()
fopen()
srand()
ShellSort()
main()
RadixSort()
HeapSort()
mergeSort()
QuickSort()
fclose()
Partition()
2.详细设计(实现程序模块的具体算法)
2.1主函数:
voidmain()
int*p,n,way,dlta[4]={5,3,2,1},L=11;
longi;
FILE*fp,*fp1;
if(!
(fp=fopen("
queue.txt"
"
w+"
)))
printf("
打开文件queue.txt失败!
"
);
(fp1=fopen("
nonqueue.txt"
打开文件nonqueue.txt失败!
printf("
请输入随机种子:
\n"
scanf("
%d"
&
n);
p=(int*)malloc(MAX*sizeof(int));
for(i=1;
i<
MAX;
i++)
{
p[i]=rand();
fprintf(fp1,"
%-8d"
p[i]);
}
fclose(fp1);
\n\t\t****************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合算法设计实验报告 精品 综合 算法 设计 实验 报告