数据结构课程设计报告---几种排序算法的演示(附源代码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计报告

—几种排序算法的演示

时间:2010-1-14

一需求分析

运行环境

Microsoft Visual Studio 2005

程序所实现的功能

对直接插入排序、折半插入排序、冒泡排序、简单选择排序、快速排序、堆排序、归并排序算法的演示,并且输出每一趟的排序情况。

程序的输入(包含输入的数据格式和说明)

<1>排序种类三输入

<2>排序数的个数的输入

<3>所需排序的所有数的输入

程序的输出(程序输出的形式)

<1>主菜单的输出

<2>每一趟排序的输出,即排序过程的输出

二设计说明

算法设计思想

<1>交换排序(冒泡排序、快速排序)

交换排序的基本思想是:对排序表中的数据元素按关键字进行两两比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。

<2>插入排序(直接插入排序、折半插入排序)

插入排序的基本思想是:每一次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。开始时建立一个初始的有序序列,它只包含一个数据元素。然后,从这个初始序列出发不断插入数据元素,直到最后一个数据元素插到有序序列后,整个排序工作就完成了。

<3>选择排序(简单选择排序、堆排序)

选择排序的基本思想是:第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟(例如第i趟,i=1,…,n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素,作为有序数据元素序列的第i个数据元素。等到第n-1趟选择结束,待排序数据元素仅剩下一个时就不用再选了,按选出的先后次序所得到的数据元素序列即为有序序列,排序即告完成。

<4>归并排序(两路归并排序)

两路归并排序的基本思想是:假设初始排序表有n个数据元素,首先把它看成是长度为1的首尾相接的n个有序子表(以后称它们为归并项),先做两两归并,得n/2上取整个长度为2的归并项(如果n为奇数,则最后一个归并项的长度为1);再做两两归并,……,如此重复,最后得到一个长度为n的有序序列。

程序的主要流程图

程序的主要模块(要求对主要流程图中出现的模块进行说明)

程序的主要模块主要分为主菜单模块和排序算法演示模块。

<1>主菜单

主要功能:程序运行时,可使运行者根据提醒输入相关操作,从而进入不同的排序方法或者退出。

<2>排序方法及输出

根据运行者对排序的不同选择,进入排序过程

a.直接插入排序:根据直接排序的算法,输出排序过程

b.折半插入排序:根据折半插入的算法,输出排序过程

c.冒泡排序:根据冒泡排序算法,输出排序过程

d.简单选择排序:根据简单选择排序的算法,输出排序过程

e.快速排序:根据快速排序的算法,输出排序过程

f.堆排序:根据堆排序的算法,输出排序过程

g.归并排序:根据归并排序的算法,输出排序过程

程序的主要函数及其伪代码说明

<1>模板类

主要说明程序中用到的类的定义

templateclass sortlist

{ private:

int currentsize;排序表中的数据元素,利用堆的调整算法形成初始堆。

b.输出堆顶元素。

c.对剩余元素重新调整形成堆。

d.重复执行第b 、c 步,直到所有数据元素被输出。

(1)建立最大堆的伪代码如下:

template 此循环,当i 与j 中有一个已经超出表长时,将另一个表中的剩余部分照抄到新表C[k]~C[m+n]中。

下面的归并算法中,两个待归并的有序表首尾相接存放在数组[]中,其中第一个表的下标范围从left 到mid ,另一个表的下标范围从mid+1到right 。前一个表中有mid-left+1个数据元素,后一个表中有right –mid 个数据元素。归并后得到的新有序表有right –mid 个数据元素。归并后得到的新有序表存放在另一个辅助数组[]中,其下标范围从left 到right 。

伪代码如下:

template void

sortlist::merge(sortlist&sourcetable,sortlist&mergedtable,con st int left,const int mid,const int right) {

int i=left,j=mid+1,k=left;快速排序(不稳定的排序方法) 1.时间复杂度

最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n2)

1111-=∑-=n n i 22

)1(211n n n i n i ≈-=∑= 22)1)(4()2(2

11n n i n i ≈-+=+∑= 42n 42

n )(21)(211

n n i n n i -=-∑-=)

(2

3)(32

1

n n i n n i -=-∑=

2.空间复杂度:需栈空间以实现递归

最坏情况:S(n)=O(n)

一般情况:S(n)=O(log2n)

f. 堆排序(不稳定的排序方法)]

1.间复杂性为O(nlog2n)。

2空间复杂性为O(1)。

g. 归并排序(稳定的排序方法)

1时间复杂度为O(nlog2n)。

2空间复杂度为O(n)。

3)运行情况

主菜单

相关文档
最新文档