如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第10章内部排序数据结构课程的内容10.1概述2.排序的目的是什么?——按排序的规则不同,可分为5类:插入排序(希尔排序)交换排序(快速排序)选择排序(堆排序)归并排序基数排序大多数排序算法都有两个基本的操作:(1)比较两个关键字的大小(2)将记录从一个位置移动到另一个位置记录序列的存储方式:(1)顺序存储(2)静态链表(3)地址在最好情况下,即待排记录序列已经是从小到大排好顺序时,其时间复杂度为O(n)。将一组杂乱无章的数据按一定的规律顺次排列起来。KeyTypekey;//关键字直接插入排序的算法分析例如(25,21,49,26,56,76)for(i=2;i<=l->length;i++)voidInsertsort(SqList*l)【3,6,13,31】,9,27,5,11{inti,j;将一组杂乱无章的数据按一定的规律顺次排列起来。若存在一种确定的关系:最坏情况下,第i趟插入时,第i个对象必须与前面i-1个对象都做关键码比较,并且每做1次比较就要做1次数据移动。j--;大多数排序算法都有两个基本的操作:【3,5,6,9,13,27,31】,11这样的操作称之为排序。10.2插入排序1)直接插入排序例2:关键字序列T=(21,25,49,25*,16,08),请写出直接插入排序的具体实现过程。编程实现直接插入排序对应程序参见教材P265。若设待排序的对象个数为n,则算法需要进行n-1次插入。最好情况下,排序前对象已经按关键码大小从小到大有序,每趟只需与前面的有序对象序列的最后一个对象的关键码比较1次,移动2次对象。因此,总的关键码比较次数为n-1,对象移动次数为2(n-1)。最坏情况下,第i趟插入时,第i个对象必须与前面i-1个对象都做关键码比较,并且每做1次比较就要做1次数据移动。则总的关键码比较次数KCN和对象移动次数RMN分别为若待排序对象序列中出现各种可能排列的概率相同,则可取上述最好情况和最坏情况的平均情况。在平均情况下的关键码比较次数和对象移动次数约为n2/4。因此,直接插入排序的时间复杂度为o(n2)。直接插入排序是一种稳定的排序方法。2)折半插入排序讨论:若记录是链表结构,用直接插入排序行否?折半插入排序呢?例2:关键字序列T=(21,25,49,25*,16,08),请写出直接插入排序的具体实现过程。直接插入排序的改进希尔排序(又称缩小增量排序)其基本思想:对待排记录序列先作“宏观”调整,再作“微观”调整。将记录序列分成若干子序列,分别对每个子序列进行插入排序。希尔排序(又称缩小增量排序)其基本思想:对待排记录序列先作“宏观”调整,再作“微观”调整。分析:开始时dk的值较大,子序列中的对象较少,排序速度较快;注:大多数排序算法都是针对顺序表结构的(便于直接移动元素)中的关键码按从小到大的顺序进行排序,则初始步长为4的希尔排序一趟的结果是?//r[0]一般作哨兵或缓冲区希尔排序(又称缩小增量排序)其基本思想:对待排记录序列先作“宏观”调整,再作“微观”调整。{R[d],R[2d],R[3d],…,R[kd],R[(k+1)d]}while(l->r[0].例1:关键字序列T=(13,6,3,31,9,27,5,11),KeyTypekey;//关键字把r[i]暂存在第0号单元;请写出直接插入排序的中间过程序列。{K1、K2…Kn};随着排序进展,dk值逐渐变小,子序列中对象个数逐渐变多,由于前面工作的基础,大多数对象已基本有序,所以排序速度仍然很快。插入排序有多种具体实现算法:【3,6,13,31】,9,27,5,11内部排序的算法有哪些?练习希尔排序的实现InfoTypeotherinfo;//其它数据项{R[2],R[2+d],R[2+2d],…,R[2+kd]}将记录序列{R1、R2…Rn}排成按该关键字有序的序列:KeyTypekey;//关键字排序算法的好坏如何衡量?若设待排序的对象个数为n,则算法需要进行n-1次插入。每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。//r[0]一般作哨兵或缓冲区{R[d],R[2d],R[3d],…,R[kd],R[(k+1)d]}【3,6,13,31】,9,27,5,11大多数排序算法都有两个基本的操作:for(i=2;i<=l->length;i++)KeyTypekey;//关键字希尔排序的效率作业