课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告
设计题目: 内部排序算法的性能分析
学校:江苏师范大学
院系:
专业班级:
学生姓名:
指导教师:
2012年5月17日
目录
1.设计内容 (1)
1.1问题描述 (1)
1.2设计要求 (1)
1.3开发环境 (1)
1.4研究思路 (1)
2. 设计步骤 (3)
2.1需求分析 (3)
2.2概要设计 (3)
2.3详细设计 (5)
2.4调试分析 (12)
2.5测试结果 (15)
3. 设计成果展示 (16)
3.1用户手册 (16)
3.2程序运行部分截图 (16)
4. 总结与心得体会 (22)
5.参考文献 (23)
附录关键代码 (24)
1.设计内容
1.1问题描述
设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数。
1.2设计要求
(1)对起泡排序、直接排序、折半排序、快速排序、希尔排序、归并排序
算法进行比较;
(2)待排序表的表长不小于100,表中数据随机产生,至少用5组不同数
据作比较,比较指标有:关键字参加比较次数和关键字的移动次数(关键字交换记为3次移动);
(3)输出比较结果。
1.3开发环境
VC++6.0
1.4研究思路
采用C语言中的rand()函数随机生成100--200个数,存入一个一维数组中,然后将数组中的值通过循环赋值给Sqlist L,注意L.r[0].key不要赋值,因为在排序中L.r[0].key时常作为一个哨兵,用来存放一些关键字。然后通过函数调用,分别进行直接插入排序,折半排序,希尔排序,起泡排序,快速排序,和归并排序,
即:
InsertSort(&L1);直接插入排序
BInsertSort(&L2);折半排序
ShellInsert(&L3,i);希尔排序
Qipaosort(&L6);起泡排序
Quicksort(&L4);快速排序
MergeSort(&L5);归并排序
通过以上函数的调用,可以将初始的每个Sqlist L,分别排序为一个从小到大的序列,然后通过循环操作,将每个经过排序后的序列输出至屏幕,并且将一些关键字比较次数,关键字移动次数输出至屏幕。接着进行写文件操作,并将该文件命名为“paixu.txt”将排序的结果通过文件的方式进行存储,并将关键字移动,关键字比较的信息写入文件,便于最后的对内部排序各种方法的分析与总结,可以以图和表的形式进行分析。
2.设计步骤
2.1需求分析
2.1.1程序的基本功能:
通过计算机随机生成100-200个随机数,利用直接插入排序,折半排序,希尔排序,起泡排序,快速排序,以及归并排序六种方法进行排序,并统计每一种排序的关键字移动次数,关键字参与比较次数,最后进行数据分析。
2.1.2程序的实际意义及背景:
排序是计算机程序设计中的一种重要操作。它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。
内部排序方法很多,但我们无法确定哪一种方法是最好的,每一种方法都有各自的缺点与优点,适合在不同的环境下使用。
本课程设计通过直接插入排序,折半排序,希尔排序,起泡排序,快速排序,以及归并排序六种方法的性能比较,让我们更好地掌握这些排序的基本思想及排序算法,加深我们队各种数据结构的逻辑结构,存储结构的理解。
2.1.3本课程设计目标:
用至少5组100—200的随机数据对每种方法做测试与比较,最后通过图或者表的形式汇总数据,对这些内部排序算法进行性能分析。
2.2概要设计
2.2.1所需的ADT(抽象数据类型):
typedef int KeyType;//元素类型
typedef struct{
KeyType key;
}RedType;
typedef struct{
RedType r[MAXSIZE+1];
int length;
}Sqlist;//顺序表类型
2.2.2原始数据:
由c语言中的rand()函数随机生成,为了使随机生成的每组数据不同,我们需要在生成数据之前,获得一个种子,所谓种子,它的作用是使生成的每一组随机数均为不同的数据,若获得一个种子,那么每一组数据最后生成的都一样,就无法达到真正的随机,也无法对排序的性能进行分析。
#define SIZE 100//其中100可以改为100—200之间的任意整数,即//代表参与比较的随机数的数量
int A[SIZE];
srand((unsigned) time(NULL)); //生成随机数种子
for (i=1;i<=SIZE;i++)
{
A[i-1]=rand()%200;
L1.length++;
L2.length++;
L3.length++;
L4.length++;
L5.length++;
L6.length++;
}
2.2.3输出数据:
主程序通过屏幕显示以及文件存储的形式对排序的序列以及关键字移动次数,关键字参加比较次数等信息进行输出。
2.3详细设计
2.3.2系统模块划分以及模块功能:
主要分为两个模块:
1、主程序模块:
int main()
{
}
2、排序模块:
A. InsertSort(&L1);直接插入排序
B. BInsertSort(&L2);折半排序
C. ShellInsert(&L3,i);希尔排序
D. Qipaosort(&L6);起泡排序
E. Quicksort(&L4);快速排序
void Qsort(Sqlist *L,int low,int high)
F. MergeSort(&L5);归并排序
void Merge (RedType SR[], RedType TR[], int i, int m, int n)
void MSort(RedType SR[], RedType TR1[], int s, int t)
2.3.3六种排序的基本思想:
1、直接插入排序待排序的记录放在数组R[0…n-1]中排序过程中某一时刻,R被划分成两个子区间R[0…i-1] (有序和)R[i…n-1](无序)。直接插入的基本操作是将当前无序区的一个记录R[i]插入到有序区R[0…i-1]中适当的位置。
2、折半排序:利用“折半查找”为查找方式的排序方法。
3、希尔排序:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
4、起泡排序:相邻的两个元素进行比较,将小的调到前面,大的调到后面。