内部排序算法比较

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

内部排序算法比较

一、需求和规格说明

1. 对常用的6种内部排序算法进行比较:冒泡排序,直接插入排序,

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

2. 待排序表的表长不小于500;其中的数据要用伪随机数产生程序产

生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动) 3. 最后要对结果作出简单分析,包括对各组数据得到结果波动大小的

解释。

2. 设计

1. 存储结构

采用顺序表的存储结构

typedef struct

{

int *elem;

int length;

}SqList;

定义6个内容相同的顺序表:SqList L1,L2,L3,L4,L5,L6;

2. main函数的过程:

六个链表初始化InitList_Sq(SqList &L)

for(i=0;i<5;i++)

void CreateRand(SqList &L)产生伪随机数,并且将值赋在L.elem[MAXSIZE]里

销毁链表

结束

Copy_List(L,L1,L2,L3,L4,L5,L6)

六个顺序表中的内容完全一样

SelectSort(L1);//简单选择排序

InsertSort(L2);//直接插入排序

Bubble_Sort(L3);//起泡排序

Quick_Sort(L4);//快速排序

Shell_Sort(L5);//希尔排序

Heap_Sort(L6);//堆排序

在各个排序函数中,会输出各种排序生成的关键词比较次数和移动次数1).链表初识化InitList_Sq(SqList &L)。为L.elem分配地址空间,且令L.length=0

2).void CreateRand(SqList &L)产生伪随机数,并且将值赋在L.elem[MAXSIZE]里

函数代码如下:

void CreateRand(SqList &L)

{

L.length=0;

for(int i=1;i

{

L.elem[i]=rand()%INFINE;

L.length++;

}

}

3).Copy_List(L,L1,L2,L3,L4,L5,L6);将顺序表L中的信息复制给

L1,L2,L3,L4,L5,L6;

4).依次进行各种排序,在各个排序函数中,输出各自的关键字比较次数和移动次数。

5)在希尔排序中为其设计的增量序列dlta为:

int dlta[6]={1,4,16,64,256,512};

for(t=0;dlta[t]

t--;//t值,为进行一次排序的次数。

3、 结果分析:

简单选择排序、气泡排序的关键字比较次数近似于n*(n-1)/2,两者相同且数值固定。但是,简单选择排序的移动次数要小很多。希尔排序和直接插入排序的关键字比较次数和移动次数都相近。快速排序的比较次

数和移动次数都很小,但是,总体来说堆排序无论是比较次数还是移动次数都是最优。

4、 调试中遇到的问题

1. 最开始编译时,一直出现错误因为没有提示行一直不明白怎么回

事:

error C2144: syntax error : missing ';' before type 'int'

最后发现原因是:在定义顺序表结构体时,顺序表名称后面没

加“;”,

这说明对C++一些语法的运用没掌握牢固。

2. 最初只定义了一个顺序表L,依次调用各个排序函数,运行结果发

现,直接插入排序、气泡排序、希尔排序的关键字移动次数为0,调试发现顺序表在经过第一次排序:简单选择排序后已经变为有序的了。但是,不理解的是:所有的排序函数参数的调用都是值调用,如:void SelectSort(SqList L);而非引用

void SelectSort(SqList &L);为什么顺序表中的数值改变了呢?

运行结果如图:

然后,我理解成:如果认为L.elem就相当于数组c[n],假设函数fun (int *c);那么,那么在fun函数里改变c[]的值,改变结果是会被保存下来的。顺序表L.elem是个指针,所以即使没有写:所以在第一次排序进行关键字交换后,指针对应的数值便改变了。

SqList &L,顺序表L已经是地址传递了。

5、 结果截图

排序前

排序后

相关文档
最新文档