- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
插
您可能关注的文档
- 第21课科学技术(上)资料.ppt
- 《第二节国际经济合作》课件.ppt
- 《第六课走近老师》课件.ppt
- 循环农业与农村生态文明建设概要.ppt
- 《第十四课品质:市场的通行证》.ppt
- 微信11月培训概要.ppt
- 徒手线条和建筑钢笔画配景教程概要.ppt
- 《管理学》第九章组织文化(马建会版).ppt
- 《管理学》第十三章领导(马建会版).ppt
- 微信公众账号的业务介绍及开发概要.pptx
- 数据仓库:Redshift:Redshift与BI工具集成.docx
- 数据仓库:Redshift:数据仓库原理与设计.docx
- 数据仓库:Snowflake:数据仓库成本控制与Snowflake定价策略.docx
- 大数据基础:大数据概述:大数据处理框架MapReduce.docx
- 实时计算:GoogleDataflow服务架构解析.docx
- 分布式存储系统:HDFS与MapReduce集成教程.docx
- 实时计算:Azure Stream Analytics:数据流窗口与聚合操作.docx
- 实时计算:Kafka Streams:Kafka Streams架构与原理.docx
- 实时计算:Kafka Streams:Kafka Streams连接器开发与使用.docx
- 数据仓库:BigQuery:BigQuery数据分区与索引优化.docx
文档评论(0)