《数据结构与算法》实验报告
一、需求分析
问题描述:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
基本要求:
(l)对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。
十八大看黄禁用免费app(2)待排序表的表长不小于100000;其中的数据要用伪随机数程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)。
(3)最后要对结果作简单分析,包括对各组数据得出结果波动大小的解释。数据测试:
二.概要设计
1.程序所需的抽象数据类型的定义:
typedef int BOOL; //说明BOOL是int的别名
typedef struct StudentData { int num; //存放关键字
}
Data; typedef struct LinkList { int Length; //数组长度
Data Record[MAXSIZE]; //用数组存放所有的随机数
} LinkList int RandArray[MAXSIZE]; //定义长度为MAXSIZE的随机数组
void RandomNum() //随机生成函数
void InitLinkList(LinkList* L) //初始化链表
BOOL LT(int i, int j,int* CmpNum) //比较i和j 的大小
void Display(LinkList* L) //显示输出函数
void ShellSort(LinkList* L, int dlta[], int t,int* CmpNum, int* ChgNum) //希尔排序
void QuickSort (LinkList* L, int* CmpNum, int* ChgNum) //快速排序
void HeapSort (LinkList* L, int* CmpNum, int* ChgNum) //堆排序
void BubbleSort(LinkList* L, int* CmpNum, int* ChgNum) //冒泡排序
void SelSort(LinkList* L, int* CmpNum, int* ChgNum) //选择排序
void Compare(LinkList* L,int* CmpNum, int* ChgNum) //比较所有排序
2 .各程序模块之间的层次(调用)关系:
二、详细设计
typedef int BOOL; //定义标识符关键字BOOL别名为
int typedef struct StudentData //记录数据类型
{
int num; //定义关键字类型
linux命令大全速查手册}Data; //排序的记录数据类型定义
typedef struct LinkList //记录线性表
{
int Length; //定义表长 个人网页制作模板素材
Data Record[MAXSIZE]; //表长记录最大值
}LinkList; //排序的记录线性表类型定义
int RandArray[MAXSIZE]; //定义随机数组类型及最大值
/******************随机生成函数********************/
flash什么意思void RandomNum()
unix功能{
int i; srand((int)time(NULL)); //用伪随机数程序产生伪随机数
for(i=0; i小于MAXSIZE; i++) RandArray[i]<=(int)rand(); 返回;
}
/*****************初始化链表**********************/
void InitLinkList(LinkList* L) //初始化链表
{
int i;
memset(L,0,sizeof(LinkList));
RandomNum();
for(i=0; i小于<MAXSIZE; i++)
L->Record[i].num<=RandArray[i]; L->Length<=i;
冒泡排序代码c语言}
BOOL LT(int i, int j,int* CmpNum)
{
(*CmpNum)++; 若i<j) 则返回 TRUE; 否则返回 FALSE;
}
void Display(LinkList* L)
{
FILE* f; //定义一个文件指针f int i;
若打开文件的指令不为空则 //通过文件指针f打开文件为条件判断
{ //是否应该打开文件 输出“can't open file”; exit(0); }
for (i=0; i小于L->Length; i++)
fprintf(f,"%d\n",L->Record[i].num);
通过文件指针f关闭文件;
三、调试分析
1.调试过程中遇到的问题及经验体会:
在本次程序的编写和调试过程中,我曾多次修改代码,并根据调试显示的界面一次次调整代码。在调试成功之前,我的程序因为3个错误而无法运行,在经过完整并且仔细的检查后,发现3处错误分别是没有定义变量就直接套用、忘记加指针符号、忘记在嵌套语句后加
大括号,这些看似不显眼的小问题却导致整个程序无法运行,所以我认为在编程过程中要及其严谨,尽量少犯或避免犯语法错误,保证代码的完整性。
2.算法的时空分析:
1.稳定性比较: 插入排序、冒泡排序、简单选择排序及其他线形排序是稳定的; 希尔排序、快速排序、堆排序是不稳定的。
2.时间复杂性比较: 插入排序、冒泡排序、选择排序的时间复杂性为O(n2); 其它非线形排序的时间复杂性为O(nlog2n); 线形排序的时间复杂性为O(n)。
3.辅助空间的比较: 线形排序的辅助空间为O(n),其它排序的辅助空间为O(1)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论