第10章 排序.ppt
《第10章 排序.ppt》由会员分享,可在线阅读,更多相关《第10章 排序.ppt(48页珍藏版)》请在麦多课文档分享上搜索。
1、第10章 排序,排序的基本概念 插入排序 选择排序 交换排序归并排序 基数排序 性能比较,主要知识点,10.1 排序的基本概念,排序是对数据元素序列建立某种有序排列的过程,是把一个数据元素序列整理成按关键字递增(或递减)排列的过程。 关键字是要排序的数据元素集合中的一个域,排序是以关键字为基准进行的。 主关键字:数据元素值不同时该关键字的值也一定不同,是能够惟一区分各个不同数据元素的关键字;不满足主关键字定义的关键字称为次关键字。 内部排序是把待排数据元素全部调入内存中进行的排序。 外部排序是因数量太大,把数据元素分批导入内存,排好序后再分批导出到磁盘和磁带外存介质上的排序方法。,比较排序算法
2、优劣的标准: (1)时间复杂度:它主要是分析记录关键字的比较次数和记录的 移动次数 (2)空间复杂度 :算法中使用的内存辅助空间的多少 (3)稳定性:若两个记录A和B的关键字值相等,但排序后A、B的 先后次序保持不变,则称这种排序算法是稳定的,10.2插入排序,插入排序的基本思想是:每步将一个待排序的数据元素,按其关键码大小,插入到前面已经排好序的一组数据元素的适当位置上,直到数据元素全部插入为止。,1.直接插入排序,常用的插入排序有直接插入排序和希尔排序两种。,其基本思想是:顺序地把待排序的数据元素按其关键字值的大小插入到已排序数据元素子集合的适当位置。,算法如下: void InsertS
3、ort (DataType a, int n) /用直接插入法对a0-an-1排序 int i, j;DataType temp;for(i=0; i -1 ,算法分析:,(1)时间效率: 因为在最坏情况下,所有元素的比较次数总和为(01n-1)O(n2)。其他情况下也要考虑移动元素的次数。 故时间复杂度为O(n2) (2)空间效率:仅占用1个附加内存单元O(1)(3)算法的稳定性:稳定,直接插入排序过程,2.希尔(shell)排序(又称缩小增量排序),(1)基本思想:把整个待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序;小组的个数逐次缩小,当完成了所有数据元素都在一个
4、组内的排序后排序过程结束。 (2)技巧:小组的构成不是简单地“逐段分割”,而是将相隔某个增量dk的记录组成一个小组,让增量dk逐趟缩短(例如依次取5,3,1),直到dk1为止。 (3)优点:让关键字值小的元素能很快前移,且序列若基本有序时,再用直接插入排序处理,时间效率会高很多。,算法如下: void ShellSort (DataType a, int n, int d, int numOfD) /用希尔排序法对元素a0-an-1排序,d0-dnumOfD-1为希尔增量值 int i, j, k, m, span;DataType temp;for(m = 0; m -1 ,希尔排序的排序过
5、程,10.3 选择排序,基本思想是:每次从待排序的数据元素集合中选取关键字最小(或最大)的数据元素放到数据元素集合的最前(或最后),数据元素集合不断缩小,当数据元素集合为空时选择排序结束。,常用的选择排序算法:(1)直接选择排序(2)堆排序,1.直接选择排序,基本思想是:从待排序的数据元素集合中选取关键字最小的数据元素并将它与原始数据元素集合中的第一个数据元素交换位置;然后从不包括第一个位置上数据元素的集合中选取关键字最小的数据元素并将它与原始数据元素集合中的第二个数据元素交换位置;如此重复,直到数据元素集合中只剩一个数据元素为止。,优点:实现简单 缺点:每趟只能确定一个元素,表长为n时需要n
6、-1趟,算法如下: void SelectSort(DataType a, int n) int i, j, small;DataType temp;for(i = 0; i n-1; i+) small = i; /设第i个数据元素关键字最小for(j = i+1; j n; j+) /寻找关键字最小的数据元素if(aj.key asmall.key) small=j;/记住最小元素的下标if(small != i) /当最小元素的下标不为i时交换位置temp = ai;ai = asmall;asmall = temp; ,直接选择排序的排序过程,算法分析 时间效率: O(n2)虽移动次数
7、较少,但比较次数仍多。 空间效率:O(1)没有附加单元(仅用到1个temp) 算法的稳定性:不稳定,2.堆排序,基本思想:把待排序的数据元素集合构成一个完全二叉树结构,则每次选择出一个最大(或最小)的数据元素只需比较完全二叉树的高度次,即log2n次,则排序算法的时间复杂度就是O(nlog2n)。,一、堆的定义 堆分为最大堆和最小堆两种。定义如下: 设数组a中存放了n个数据元素,数组下标从0开始,如果当数组下标2i+1n时有:ai.keya2i+1.key(ai.keya2i+1.key);如果当数组下标2i+2n时有:ai.keya2i+2.key (ai.keya2i+2.key),则这样
8、的数据结构称为最大堆(最小堆)。,(a)完全二叉树 (b)最大堆,性质: (1)最大堆的根结点是堆中值最大的数据元素,最小堆的根结点是堆中值最小的数据元素,我们称堆的根结点元素为堆顶元素。 (2)对于最大堆,从根结点到每个叶结点的路径上,数据元素组成的序列都是递减有序的;对于最小堆,从根结点到每个叶结点的路径上,数据元素组成的序列都是递增有序的。,二、 创建堆,终端结点(即叶子)没有任何子女,无需单独调整,步骤:从最后一个非终端结点开始往前逐步调整,让每个双亲大于(或小于)子女,直到根结点为止。,创建最大堆过程中要多次调用函数:调整完全二叉树中某个非叶结点ai(i = (n-1)/2)使之满足
9、最大堆定义,前提条件是该结点的左孩子结点a2i+1和右孩子结点a2i+2都已是最大堆。函数设计如下:,void CreatHeap (DataType a, int n, int h) int i, j, flag;DataType temp;i = h; / i为要建堆的二叉树根结点下标j = 2*i+1; / j为i的左孩子结点的下标temp = ai;flag = 0;while(j aj.key) /ai.keyaj.keyflag=1; /标记结束筛选条件else /否则把aj上移 ai = aj;i = j;j = 2*i+1;ai = temp; /把最初的ai赋予最后的aj ,
10、初始化创建最大堆算法如下: void InitCreatHeap(DataType a, int n) int i; for(i = (n-2)/2; i = 0; i-) CreatHeap(a, n, i); ,堆排序的基本思想是:循环执行如下过程直到数组为空:(1)把堆顶a0元素(为最大元素)和当前最大堆的最后一个元素交换;(2)最大堆元素个数减1;(3)由于第(1)步后根结点不再满足最大堆的定义,所以调整根结点使之满足最大堆的定义。,三、堆排序算法,完全二叉树调整为最大堆的过程,堆排序算法如下: void HeapSort(DataType a, int n) int i;DataTy
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 排序 PPT
