内部排序算法比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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、 结果截图 排序前 排序后