数据结构10排序.ppt

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构10排序

第十章 排序 内容提要 本课主题: 排序的概念、插入排序,冒泡排序、快速排序,选择排序,堆排序,归并排序,其它排序方法 教学目的: 掌握排序的基本概念,掌握插入排序、冒泡排序、快速排序,选择排序,堆排序,归并排序算法,了解其它排序方法 教学重点: 插入排序、冒泡排序、快速排序,选择排序,堆排序,归并排序 教学难点: 快速排序,堆排序 一、排序概述 排序:将一个数据元素的无序序列重新排列成一个按关键字有序的序列。 下图所示给出了两组按年龄排序的结果。注意其中有两个人的年龄相同。 排序的稳定性 键值相等的记录排序前后相对顺序不变的排序方法是稳定的!键值相等的记录排序前后相对顺序可能更改的排序方法是不稳定的! 提问:上图所示两个排序其稳定性怎样? ——前者不确定,后者不稳定 一般稳定性不重要,但是有些特殊场合,如银行、司法、招生等特别关心先后顺序的场合要注意稳定性问题 排序的分类 内部排序:待排序记录存放在计算机的内存中进行的排序过程; 外部排序:待排序记录数量很大,以致内存一次不能容纳全部记录,在排序过程中需对外存进行访问的排序过程。外部排序的效率主要取决于外存的访问频度。 排序方法分类 排序方法: 构造二叉排序树本身也是一个排序过程 交换排序(起泡排序、快速排序) 选择排序(简单选择排序,堆排序) 插入排序(直接插入排序、希尔排序) 归并排序 基数排序 二、交换排序 ★1、起泡排序(冒泡排序) 每一趟都从头部(或尾部)开始依次交换相邻逆序记录,直到在某趟排序过程中没有进行过交换记录的操作为止 冒泡排序 void BubbleSort(SqList L) { ????for(i=1; iL.length; ++i) //i:趟次,即一趟冒泡后最小元素在结果表中的位序。 ??? //每一趟交换L.r[i~length]中相邻逆序元素 ???? //结果:最小元素到达第i处 ???????? for(j=L.length-1; j=i; --j) //交换L.r[i~length]中相邻逆序元素。 ???? //注意前后两个循环语句的走向相反 ???????????? if(L.r[j+1].key L.r[j].key) //这里下标=位序 ???????????????? L.r[j+1] --- L.r[j]; //注意无else语句 } 冒泡排序 算法2(参见P16,改进方法:一旦某趟没有进行过交换操作则排序结束,设置change标志标识之): void BubbleSort(SqList L) { ????for(i=1, change=true; iL.length change==true; ++i) ????{ ??//i:趟次,一趟冒泡后最小元素在结果表中的位序 ??????? change=false; ??????? for(j=L.length-1; j=i; --j) //从后向前交换相邻逆序元素 ??????????? if(L.r[j+1].key L.r[j].key) //这里下标=位序 ??????????????? {L.r[j+1] --- L.r[j]; change=true;} //注意无else语句 ????} } //结束条件是该趟没有进行过交换操作 冒泡排序性能分析 性能分析: 比较操作:O(n2);移动操作:O(n2)。 辅助空间:1。 稳定性:稳定 提问:对整数序列32154进行从小到大的排序,经过一趟冒泡排序之后的序列怎样?完成排序至少需要多少趟? 答:13245,3趟。从左到右时:21345,3趟 快速排序 ★2、快速排序 提问:编写算法将线性表中所有负数排在非负数前,要求时间复杂度、空间复杂度越低越好。 快速排序 每一趟排序以某个元素为基准将待排记录分割成独立的两部分,小于基准的记录放在基准的前面,大的放在后面。该基准称之为枢轴。 例如以第一个元素为基准,经一趟排序后期望达到的效果如图: 下一趟排序,由于比较操作将局限在各部分内进行,不会与整个表中每个元素逐一比较,比较次数会逐趟减半,趟次也大大减少。如图: 快速排序 提问: 1.快速排序稳定吗?为什么? 答:不稳定,例如如果元素27是38! 2.对整数序列3215434323432进行从小到大的排序,求经过一趟快速排序(划分)后的序列? 答:1235422333434 3.对恰好有序或逆序的序列进行一趟划分,求元素移动次数。 答:恰好有序时2次;恰好无序时3次。 4.编写算法将线性表中所有负数排在非负数之前。 答:借助划分的思路,或前几页最后一个方法(如图,但不一定好) 快速排序 划分算法的整体思路: Parti

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档