数据结构课程设计--内部排序算法的比较

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

数据结构课程设计

题目:内部排序算法的比较

姓名:李吉倩

学号:020*********

系年级:计算机科学与技术2010级

完成时间:2012.8-2012.9

实验报告

一、需求分析

1.本程序对以下六种常用的内部排序进行实测比较:起泡排序、直接插入

排序、简单选择排序、快速排序、希尔排序、堆排序。

2.待排序表的元素的关键字为整数,雍正徐、逆序和随机数产生器产生的随机数做测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。

3.程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”下,用户可由键盘输入产生随机数的种子,计算机终端显示各内部排序的比较参数。

4.最终对结果做出简单分析,包括对各组数据得出结果波动大小给予解释。

二、概要设计

1.可排序表的抽象数据类型定义:

ADT OrderableList

{

数据对象:D = {a

i |a

i

∈IntegerSet,i = 1,2,……,n,n >= 0}

数据关系:R1 = {

i-1,a

i

>|a

i-1

,a

i

∈D.i = 2,……,n}

基本操作:

SelectListType(c)

操作结果:打印提示信息,请用户选择待排序表的类型,顺序型、

逆序型还是随机数组。

BubbleSort(&L)

操作结果:进行起泡排序,返回排序后的顺序表

InsertSort(&L)

操作结果:进行插入排序,返回排序后的顺序表

SelectSort(&L)

操作结果:进行选择排序,返回排序后的顺序表

QuickSort(&L)

操作结果:进行快速排序,返回排序后的顺序表

ShellSort(&L)

操作结果:进行希尔排序,返回排序后的顺序表

HeapSort(&L)

操作结果:进行堆排序,返回排序后的顺序表

SelectSortMethod(&L,c1)

操作结果:打印提示信息,请用户选择排序方法,起泡排序、插入

排序、选择排序、快速排序、希尔排序还是堆排序

OutPut(L)

操作结果:打印排序中关键字的比较次数和移动次数

}ADT OrderableList

2.本程序包含两个模块:

1).主程序模块

int mian()

{

初始化;

用户选择待测表的类型;

输入选择,用switch语句判断;

While(“命令”!= “退出”)

{

接受命令;

处理命令;

}

}

2).可排序表单元模块----实现可排序表的抽象数据类型

各模块之间的调用关系:

主程序模块

可排序表单元模块

三、详细设计

1.根据题目要求何可排序表的基本操作特点,可排序表采用证书顺序表存储结构,并实现在头文件SqList.H。

//******************基本操作的函数原型******************\\

#define MAXSIZE 20 //用作示例的顺序表的最大长度typedef int KeyType; //定义关键字为整数类型

typedef int InfoType; //定义其他数据项也为整数类型int time_key_compare = 0; //定义全局变量,关键字比较次int time_key_move = 0; //数和移动次数均为0

typedef struct

{

KeyType key; //关键字项

InfoType otherinfo; //其他数据项

}RedType; //记录类型

typedef struct

{

RedType r[MAXSIZE + 1]; //r[0]闲置或用做哨兵

int length; //顺序表长度

}SqList; //顺序表类型

//****************************基本操作*********************\\ bool LT(KeyType a,KeyType b)//比较两个KeyType类型变量的大小{

time_key_compare ++; //比较次数+1

if(a < b)

return true; //<,返回true else

return false; //否则,返回false

void copyKey(RedType &a,RedType &b)

{ //将RedType类型变量b复制给a

a = b;

time_key_move ++; //关键字移动次数+1 }//copyKey

void swap(RedType &a,RedType &b)

{ //将RedType型变量a和b进行交换操作RedType c; //定义RedType型变量c

c = a;

a = b;

b = c;

time_key_move += 3; //关键字移动次数+3 }//swap

/****************直接插入排序*********************\

void InsertSort(SqList &L)

{ //对顺序表L做直接插入排序for(int i = 2; i <= L.length; ++i)

{

if(LT(L.r[i].key,L.r[i - 1].key))

{ //“<”,需将L.r[i]插入有序子表copyKey(L.r[0] ,L.r[i]); //复制为哨兵

copyKey(L.r[i] ,L.r[i - 1]);

for(int j = i - 2;LT(L.r[0].key,L.r[j].key); --j)

{

copyKey(L.r[j + 1] ,L.r[j]); //记录后移

}

copyKey(L.r[j + 1] ,L.r[0]); //插入到正确的位置}

}

}//InsertSort

//*************************希尔排序*************************\ void shellInsert(SqList &L,int dk)

{ //对顺序表L做一希尔插入排序。

//1.前后记录位置的增量式是dk,而不是1;

//2.r[0]只是暂存单元,不是哨兵。当 j<= 0时,插入位置已找到for(int i = dk + 1;i <= L.length; ++i)

{

if(LT(L.r[i].key,L.r[i - dk].key))

{ //需将L.r[i]插入到有序增量子表copyKey(L.r[0] ,L.r[i]); //暂存在L.r[0]中

for(int j = i - dk;j > 0 && LT(L.r[0].key,L.r[j].key); j-= dk)

copyKey(L.r[j + dk] ,L.r[j]); //记录后移

copyKey(L.r[j + dk] ,L.r[0]); //插入

相关文档
最新文档