第25章、排序、栈和队列(理论课)资料.pptx

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

使用C语言开发简单应用 第二十五章 排序、栈和队列 上一章内容回顾 文件 文件类型指针 文件的操作 打开文件 关闭文件 读写文件 文件的定位 清除流 出错的检测 2/23 本章学习目标 理解冒泡排序 理解选择排序 理解插入排序 理解栈及其操作 理解队列及其操作 3/23 内容进度 排序 冒泡排序 选择排序 插入排序 栈 队列 4/23 排序相关概念 数据列表(DataList) 待排序数据对象的有限集合 关键码(Key) 通常数据对象有多个数据成员/属性,其中有一个属性域用来区分各个数据信息/数据对象,该属性域被称为关键码。 排序 根据关键码递增/递减的顺序,把数据对象依次排列起来,使一组任意排列的对象变成一组按照关键码顺序排列的对象。 5/23 冒泡排序 基本思想: 将被排序的记录数组R[n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上飘浮。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。 初始:R[1..n]为无序区。 第一趟扫描 从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n-1],R[n-2]),(R[n-2],R[n-3]),…,(R[1],R[0]);对于每对气泡(R[j],R[j-1]),若R[j].keyR[j-1].key,则交换R[j]和R[j-1]的内容。 第一趟扫描完毕时, “最轻”的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[0]上。 第二趟扫描 扫描R[1..n-1]。扫描完毕时,次轻的气泡飘浮到R[1]的位置上…… 最后,经过n-1 趟扫描可得到有序区R[0..n-1]。 6/23 冒泡排序 例1:对数组a[5]={3,8,2,9,5};进行从小到大排序。 其排序过程可以利用下面的表格来说明: 7/23 冒泡排序 程序实现 见教材P273 排序过程示意图 8/23 内容进度 排序 冒泡排序 选择排序 插入排序 栈 队列 9/23 选择排序 基本思想: 初始状态: 无序区为R[0..n-1],有序区为空。 第1趟排序 在无序区R[0..n-1]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[0]交换,使R[0..0]和R[1..n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。 第i趟排序 第i趟排序开始时,当前有序区和无序区分别为R[0..i-2]和R[i-1..n-1](0≤i≤n-2)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i-1]交换,使R[0..i-1]和R[i..n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。 这样,n个记录的文件可经过n-1趟选择排序得到有序结果。 10/23 选择排序 程序实现: 11/23 void SelectSort(int a[],int n) { int temp=0, i=0, j=0, k=0; for( i=0; in-1; i++ ) { k=i; for( j=i+1; jn; j++ ) if( a[k]a[j] ) k=j; if(k!=i) { temp=a[i]; a[i]=a[k]; a[k]=temp; } } } 12/23 初始: [ 49 38 65 97 76 13 27 ] 13 49 一趟: 13 [38 65 97 76 49 27 ] 27 38 六趟: 13 27 38 49 65 76 [97 ] 选择排序 内容进度 排序 冒泡排序 选择排序 插入排序 栈 队列 13/23 插入排序 基本思想: 假设待排序的记录存放在数组R[n]中。初始时,R[0]自成1个有序区,无序区为R[1..n-1]。从i=1起直至i=n-1为止,依次将R[i]插入当前的有序区R[0..i-1]中,生成含n个记录的有序区。 一趟插入排序方法:首先在当前有序区R[0..i-1]中查找R[i]的正确插入位置k(0≤k≤i-2);然后将R[k..i-2]中的记录均后移一个位置,腾出k位置上的空间插入R[i]。 14/23 插入排序 例3:对数组a[5]={9,8,5,3,2};进行从小到大的排序。 其排序过程可以利用下面的表格来说明: 15/23 插入排序 各趟排序结果: 16/23 插入排序 17/23 插

文档评论(0)

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

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

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档