数据结构课程设计报告--内部排序算法比较Word格式.docx
《数据结构课程设计报告--内部排序算法比较Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告--内部排序算法比较Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计报告--内部排序算法比较Word格式.docx](https://file1.bdocx.com/fileroot1/2022-10/4/4613884b-b929-45b6-8a76-394b1e7861c6/4613884b-b929-45b6-8a76-394b1e7861c61.gif)
n8、测试结果 21
n9、参考书目 24
n10、心得体会 24.
内部排序算法比较
1.问题描述:
任务:
试通过随机的数据比较各算法的关键字比较次数和关键字移动次数要求:
(1)对以下10种常用的内部排序算法进行比较:
直接插入排序、折半插入排序、二路插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序。
(2)待排序表的表长不少于100;
其中的数据要用伪随机数产生程序产生;
至少要用5组不同的输入数据作比较;
比较的指标为有关键字参见的比较次数和关键字移动次数(关键字交换计为3次移动)。
2.基本要求:
利用随机函数产生100个随机整数,利用直接插入排序、折半插入排序、二路插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序十种排序方法进行排序(结果为由小到大的顺序),并统计比较次数CMPNUM和关键字移动次数CHGNUM.
3.测试数据:
由随机产生器决定。
4.算法思想:
//直接插入排序
voidInitLinkList(LinkList*L)
算法思想:
从第二个开始,经后面的关键字以此插入它前面已经有序的表中,从而得到一个新的、关键字增一的有序表,最终可将关键字全部排好序。
//折半插入排序
voidBInsertSort(LinkList*L, int*CmpNum, int*ChgNum)
这是对直接插入排序的改进,在关键字向前面有序表插入时,井陉这般查找,增快查找插入位置的速度。
//2-路插入排序
voidInsertSortBinary(LinkList*L, int*CmpNum, int*ChgNum)
2-路插入排序是在折半插入排序的基础上再改进之,其目的是减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。
//希尔排序
voidShellInsert(LinkList*L, intdk, int*CmpNum, int*ChgNum)
先将整个带排序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的关键字“基本有序”时,在对全体记录进行一次直接插入排序。
//起泡排序
voidBubbleSort(LinkList*L, int*CmpNum, int*ChgNum)
这是一种简单的“选择”排序的方法,将前一个关键字和后一个关键字比较,关键字大的和小的交换位置,经过一趟交换便得到了最大关键字,以此类推,经过N-1趟后,便可排序完毕。
//快速排序
voidQuickSort(LinkList*L,int*CmpNum,int*ChgNum)
这是对冒泡排序的一种改进,同过一趟排序将待排记录分割成为独立的两部分,其中一部分的关键字均比另一部分小,则可分别对这两部分记录
继续这种排序,达到有序。
//简单选择排序
intSelectMinKey(LinkList*L,intk,int*CmpNum)
对待排记录进行N-1次选择,分别选出第1至第N-1大的关键字,序列变为有序了。
每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录
//堆排序
voidHeapSort(LinkList*L,int*CmpNum,int*ChgNum)
将待排序列排成按二叉树形式存储,使所有非终结节点的治军不大于其左右孩子的值,输出堆顶的最小元素,再将其余排成堆,以此类推,可一次选出次小的元素,最终能够排好序。
//归并排序
voidMergeSort(LinkList*L,int*CmpNum,int*ChgNum)
将一维数组中前后相邻的两个有序序列归并为一个有序序列。
void//基数排序
bases(RedType**h,int*CmpNum,int*ChgNum)
voidRadixSort(LinkList*L,int*CmpNum,int*ChgNum)
这是以静态链表为存储结构的排序算法,通过不断的分配关键字,收集关键字有序列,最终使整个链表有序。
本程序中是把一个五位数拆成五个关键字,对每个关键字都进行一趟分配和一趟收集,当5趟下后,序列可排为有序序列。
5.模块划分:
模块一:
存储结构
structRedType{intkey;
structRedType*link;
};
//向量结构structLinkList{
RedTyper[MAXSIZE+1];
intLength;
//链表结构
模块二:
伪随机数产生函数
voidRandomNum(){inti;
srand(2000);
for(i=1;
i<
=MAXSIZE;
i++)
RandArray[i]=(int)rand();
}
模块三:
内部排序函数
voidInitLinkList(LinkList*L);
voidBInsertSort(LinkList*L,int*CmpNum,int*ChgNum);
//折半插入排序
voidInsertSortBinary(LinkList*L,int*CmpNum,int*ChgNum);
//二路插入排序voidShellInsert(LinkList*L,intdk,int*CmpNum,int*ChgNum);
希尔排序
voidBubbleSort(LinkList*L,int*CmpNum,int*ChgNum);
起泡排序
intPartition(LinkList*L,intlow,inthigh,int*CmpNum,int*ChgNum);
voidQuickSort(LinkList*L,int*CmpNum,int*ChgNum);
// 快速排序
intSelectMinKey(LinkList*L,intk,int*CmpNum);
//简单选择排序voidHeapAdjust(LinkList*L,ints,intm,int*CmpNum,int*ChgNum);
voidHeapSort(LinkList*L,int*CmpNum,int*ChgNum);
voidMerge(LinkList*L,intlow,intmid,inthigh,int*CmpNum,int*ChgNum);
voidMSort(LinkList*L,intlow,inthigh,int*CmpNum,int*ChgNum);
voidMergeSort(LinkList*L,int*CmpNum,int*ChgNum);
//归并排序
voidbases(RedType**h,int*CmpNum,int*ChgNum);
voidRadixSort(LinkList*L,int*CmpNum,int*ChgNum);
//基数排序模块四:
主函数main(),实现对函数的测试。
6.流程图:
主程序
循环100次
产生1组随
机数
将随机数保存在数组中
直接
插入
折半
二路
希尔
排序
起泡
快速
简单
选择
堆排
序
归并
基数
记录关键字的比较
次数和移动次数
输出关键字的比较次
数、移动次数的平均
7.源程序:
#include<
stdio.h>
#include<
stdlib.h>
string.h>
time.h>
windows.h>
winbase.h>
#defineMAXSIZE100
#defineTRUE1
#defineFALSE0
#defineD5
#defineR10 /*R为基数*/typedefintBOOL;
//****************************************************************
//定义向量结构structRedType{intkey;
//定义链表结构structLinkList
{
//*******************************************************************
//************************* 函数定义 ***************************
//随机函数定义
intRandArray[MAXSIZE+1];
voidRandomNum(){
inti;
srand((unsigned)time(0));
for(i=1;
//伪随机数产生函数
//********************************************************************
//************************排序算法函数定义
//直接插入排序
voidInitLinkList(LinkList*L){inti;
memset(L,0,sizeof(LinkList));
RandomNum();
L->
r[i].key=RandArray[i];
L->
Length=i;
boolLT(inti,intj,int*CmpNum){(*CmpN