1、n 8、测试结果21n 9、参考书目24n 10、心得体会24.内部排序算法比较1. 问题描述:任务:试通过随机的数据比较各算法的关键字比较次数和关键字移动次数要求:(1) 对以下 10 种常用的内部排序算法进行比较:直接插入排序、折半插入排序、二路插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序。(2) 待排序表的表长不少于 100;其中的数据要用伪随机数产生程序产生;至少要用 5 组不同的输入数据作比较;比较的指标为有关键字参见的比较次数和关键字移动次数(关键字交换计为 3 次移动)。2. 基本要求:利用随机函数产生 100 个随机整数,利用直接插入排序、折
2、半插入排序、二路插入排序、希尔排序、起泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序十种排序方法进行排序(结果为由小到大的顺序),并统计比较次数 CMPNUM 和关键字移动次数 CHGNUM.3. 测试数据:由随机产生器决定。4. 算法思想:/直接插入排序void InitLinkList(LinkList *L)算法思想:从第二个开始,经后面的关键字以此插入它前面已经有序的表中, 从而得到一个新的、关键字增一的有序表,最终可将关键字全部排好序。/折半插入排序void BInsertSort(LinkList *L,int *CmpNum,int *ChgNum)这是对直接插入排序
3、的改进,在关键字向前面有序表插入时,井陉这般查找,增快查找插入位置的速度。/2-路插入排序void InsertSortBinary(LinkList *L,int *CmpNum,int *ChgNum) 2-路插入排序是在折半插入排序的基础上再改进之,其目的是减少排序过程中移动记录的次数,但为此需要 n 个记录的辅助空间。/希尔排序void ShellInsert(LinkList *L,int dk,int *CmpNum,int *ChgNum)先将整个带排序列分割成为若干个子序列分别进行直接插入排序, 待整个序列中的关键字“基本有序”时,在对全体记录进行一次直接插入排序。/起泡排序v
4、oid BubbleSort(LinkList *L,int *CmpNum,int *ChgNum)这是一种简单的“选择”排序的方法,将前一个关键字和后一个关键字比较,关键字大的和小的交换位置,经过一趟交换便得到了最大关键字, 以此类推,经过 N-1 趟后,便可排序完毕。/快速排序void QuickSort(LinkList *L, int *CmpNum, int *ChgNum)这是对冒泡排序的一种改进,同过一趟排序将待排记录分割成为独立的两部分,其中一部分的关键字均比另一部分小,则可分别对这两部分记录继续这种排序,达到有序。/简单选择排序int SelectMinKey(LinkLi
5、st *L, int k, int *CmpNum)对待排记录进行 N-1 次选择,分别选出第 1 至第 N-1 大的关键字, 序列变为有序了。每一趟在 n-i+1 个记录中选取关键字最小的记录作为有序序列中第 i 个记录/堆排序void HeapSort(LinkList *L, int *CmpNum, int *ChgNum)将待排序列排成按二叉树形式存储,使所有非终结节点的治军不大于其左右孩子的值,输出堆顶的最小元素,再将其余排成堆,以此类推,可一次选出次小的元素,最终能够排好序。/归并排序void MergeSort(LinkList *L, int *CmpNum, int *Ch
6、gNum)将一维数组中前后相邻的两个有序序列归并为一个有序序列。void /基数排序bases(RedType *h,int *CmpNum, int *ChgNum)void RadixSort(LinkList *L,int *CmpNum, int *ChgNum)这是以静态链表为存储结构的排序算法,通过不断的分配关键字, 收集关键字有序列,最终使整个链表有序。本程序中是把一个五位数拆成五个关键字,对每个关键字都进行一趟分配和一趟收集,当 5 趟下后,序列可排为有序序列。5. 模块划分:模块一:存储结构struct RedType int key;struct RedType *link
7、; /向量结构struct LinkListRedType rMAXSIZE+1; int Length;/链表结构模块二:伪随机数产生函数void RandomNum() int i;srand(2000);for (i = 1; i = MAXSIZE; i+)RandArrayi = (int)rand();模块三:内部排序函数void InitLinkList(LinkList *L);void BInsertSort(LinkList *L,int *CmpNum, int *ChgNum); /折半插入排序void InsertSortBinary(LinkList *L,int
8、*CmpNum, int *ChgNum);/二路插入排序void ShellInsert(LinkList *L, int dk, int *CmpNum, int *ChgNum);希尔排序void BubbleSort(LinkList *L, int *CmpNum, int *ChgNum); 起泡排序int Partition(LinkList *L, int low, int high, int *CmpNum, int *ChgNum); void QuickSort(LinkList *L, int *CmpNum, int *ChgNum);/快速排序int SelectM
9、inKey(LinkList *L, int k, int *CmpNum);/简单选择排序void HeapAdjust(LinkList *L, int s, int m, int *CmpNum, int *ChgNum);void HeapSort(LinkList *L, int *CmpNum, int *ChgNum);void Merge(LinkList *L,int low,int mid,int high,int *CmpNum,int *ChgNum); void MSort(LinkList *L,int low,int high, int *CmpNum,int *
10、ChgNum);void MergeSort(LinkList *L, int *CmpNum, int *ChgNum);/ 归并排序void bases(RedType *h,int *CmpNum, int *ChgNum);void RadixSort(LinkList *L,int *CmpNum, int *ChgNum);/ 基数排序模块四:主函数 main(),实现对函数的测试。6. 流程图:主程序循环 100 次产生 1 组随机数将随机数保存在数组中直接插入折半二路希尔排序起泡快速简单选择堆排序归并基数记录关键字的比较次数和移动次数输出关键字的比较次数、移动次数的平均7. 源
11、程序:#include #include string.htime.hwindows.hwinbase.h #define MAXSIZE 100#define TRUE 1#define FALSE 0#define D 5#define R 10/* R 为基数 */ typedef int BOOL;/*/定义向量结构struct RedType int key;/定义链表结构struct LinkList/*/*函数定义*/随机函数定义int RandArrayMAXSIZE+1; void RandomNum()int i;srand(unsigned)time(0); for (i = 1;/伪随机数产生函数/*/* 排序算法函数定义/ 直接插入排序void InitLinkList(LinkList *L) int i;memset(L, 0, sizeof(LinkList); RandomNum();L-ri.key = RandArrayi; L-Length = i;bool LT(int i, int j, int *CmpNum) (*CmpN
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1