内部排序比较 (实验报告+源程序)C++

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

实验报告3

实验名称:数据结构与软件设计实习

题目:内部排序算法比较

专业:生物信息学班级:01 姓名:学号:实验日期:2010.07.24

一、实验目的:

比较冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序;

二、实验要求:

待排序长度不小于100,数据可有随机函数产生,用五组不同输入数据做比较,比较的指标为关键字参加比较的次数和关键字移动的次数;

对结果做简单的分析,包括各组数据得出结果的解释;

设计程序用顺序存储。

三、实验内容

对各种内部排序算法的时间复杂度有一个比较直观的感受,包括关键字比较次数和关键字移动次数。

将排序算法进行合编在一起,可考虑用顺序执行各种排序算法来执行,最后输出所有结果。

四、实验编程结果或过程:

1. 数据定义

typedef struct { KeyType key; }RedType; typedef struct { RedType r[MAXSIZE+1]; int length;

}SqList;

2. 函数如下,代码详见文件“排序比较.cpp”int Create_Sq(SqList &L)

void Bubble_sort(SqList &L)//冒泡排序void InsertSort(SqList &L)//插入排序

void SelectSort(SqList &L) //简单选择排序int Partition(SqList &L,int low,int high) void QSort(SqList &L,int low,int high)//递归形式的快速排序算法

void QuickSort(SqList &L)

void ShellInsert(SqList &L,int dk)//希尔排序

void ShellSort(SqList &L,int dlta[ ])

3. 运行测试结果,运行结果无误,如下图语速个数为20

元素个数为100

错误调试无。

调试分析:

时间复杂度与空间复杂度:

理论分析可以得出各种排序算法的时间复杂度和空间复杂度,如下表所示(图6):排序方法平均情况最好情况最坏情况辅助空间

直接插入排序O(n2)O(n)O(n2)O(1)起泡排序O(n2)O (n) O(n2)O(1)

快速排序O(n log2n)O(n log2n)O(n2)O(log2n) ~O(n)

简单选择排序O(n2)O(n2)O(n2)O(1)希尔排序O(n1..3)O(1)

◆待排序的记录数目n 的大小。

◆记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小。

◆关键字的结构及其分布情况。

◆对排序稳定性的要求

从结果中还可看出:

对于一般的排序,比较次数多,而交换次数相对较少;而快速排序比较次数和交换次数都较少,两者相差不如前者大。其中冒泡排序比较和交换次数都很大。

五、实验总结:

(1)实验中的存在问题和提高

存在问题:程序有待增强。

提高:界面处理简洁。

(2)收获与体会

随机数的生成

附录源程序

#include

#include

#include

#include

#define LS(a,b) ((a)<(b))

#define LL(a,b) ((a)>(b))

#define MAXSIZE 10000

typedef int KeyType;

typedef struct {

KeyType key;

}RedType;

typedef struct {

RedType r[MAXSIZE+1];

int length;

}SqList;

int compare=0;

int change=0;

int Create_Sq(SqList &L)

{

int k;

cout<<"元素个数:";

cin>>k;

L.length=k;

srand(time(NULL));

for (int x=1; x<=k; x++)

{

L.r[x].key= rand() % k;//随机域为0~k }

return 1;

}

void Bubble_sort(SqList &L)//冒泡排序

for(i=1;i<=L.length-1;++i){

for(j=1;j<=k-1;++j){

++m;

if(LL(L.r[j].key,L.r[j+1].key)){

l=L.r[j].key;

L.r[j].key=L.r[j+1].key;

L.r[j+1].key=l;

++n;

}

}

--k;

}

cout<

cout<<" "<

cout<

cout<<"冒泡排序的比较次数:";

cout<

cout<<"冒泡排序的交换次数:";

cout<

}

void InsertSort(SqList &L)//插入排序

{

int i,j,m=0,n=0;

cout<

for(i=2;i<=L.length;++i)

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

{

++m;

++n;

L.r[0]=L.r[i];

L.r[i]=L.r[i-1];

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

{

++m;

L.r[j+1]=L.r[j];

}

L.r[j+1]=L.r[0];

}

cout<<"-----直接插入排序后的序列-----"<

相关文档
最新文档