版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,在此幻灯片插入公司的徽标 从“插入”菜单 选择图片 找到徽标文件 单击“确定” 重新设置徽标大小 单击徽标内任意位置。徽标外部出现的方框是“调整控点” 使用这些重新设置对象大小 如果在使用尺寸调整控点前按下 shift 键,则对象改变大小但维持原比例。,DATA,10,65,865,姓名 学号 成绩 班级 李红 9761059 95 机97.6,数据结构,2020/9/7,2,注意带以下内容: 图2-8-1 图2-8-2 图2-8-3 图2-8-4 图2-8-5,2020/9/7,3,第二章数据结构与算法,(续),2020/9/7,4,2.8 排 序 2.8.1 概 述,1、排序的功能:将一
2、个数据元素(或记录)的任意序列,重新排成一个按关键字有序的序列。 2、排序过程的组成步骤: 首先比较两个关键字的大小; 然后将记录从一个位置移动到另一个位置。,2020/9/7,5,假设待排序的记录存放在地址连续的一组存储单元中,那么这种存储方式下的数据类型可描述为:,MAX,0,1,2,3,4,key,info,#define MAX 20 typedef struct int key; float otherinfo; RedType;,2020/9/7,6,排序方法,插入排序,选择排序,交换排序,归并排序,直接插入排序,折半插入排序,简单选择排序,堆排序,起泡排序,快速排序,2020/9
3、/7,7,2.8.2 插入排序 直接插入、折半插入,1、直接插入排序: 基本思想:从数组的第2号元素开始,顺序从数组中取出元素,并将该元素插入到其左端已排好序的数组的适当位置上。 举例:图8-2-1,2020/9/7,8,2.8.2 插入排序 直接插入、折半插入,该算法适合于n 较小的情况,时间复杂度为O(n2).,1、直接插入排序: 基本思想:从数组的第2号元素开始,顺序从数组中取出元素,并将该元素插入到其左端已排好序的数组的适当位置上,待排元素序列:53 27 36 15 69 42 第一次排序: 27 53 36 15 69 42 第二次排序: 27 36 53 15 69 42 第三次
4、排序: 15 27 36 53 69 42 第四次排序: 15 27 36 53 69 42 第五次排序: 15 27 36 42 53 69 直接插入排序示例,对于有n个数据元素的待排序列,插入操作要进行n-1次,2020/9/7,9,void insertSort(RedType L ,int n) int i ,j; for(i=2; i=n; i+) if(Li.keyLi-1.key) L0=Li; /* 作为监视哨*/ for( j=i-1; L0.keyLj.key; j ) Lj+1=Lj; /* 记录后移*/ Lj+1=L0; /* 插入 */ ,插入算法如下: 方法:Ki与
5、Ki-1,K i-2,K1依次比较,直到找到应插入的位置。,2020/9/7,10,2、折半插入排序 折半插入排序在寻找插入位置时,不是逐个比较而是利用折半查找的原理寻找插入位置 。待排序元素越多,改进效果越明显。,折半插入排序的条件: 在有序序列中插入一个关键字。,举例,图8-2-2,2020/9/7,11,2、折半插入排序 折半插入排序在寻找插入位置时,不是逐个比较而是利用折半查找的原理寻找插入位置。待排序元素越多,改进效果越明显。,(highlow ,查找结束,插入位置为low 或high+1 ),( 4236 ),( 4253 ),2020/9/7,12,void BinsertSor
6、t(RedType L ,int n) int i,low,high,mid; for(i=2; i=high+1; j ) Lj+1=Lj; /* 记录后移*/ Lhigh+1=L0; /* 插入*/ /* for*/ /*折半插入排序*/,折半插入排序减少了关键字的比较次数,但记录的移动次数不变,其时间复杂度与直接插入排序相同。,/*折半后的位置*/,2020/9/7,13,1、简单选择排序 思想:首先从1n个元素中选出关键字最小的记录交换到第一个位置上。然后再从第2 个到第n个元素中选出次小的记录交换到第二个位置上,依次类推。 时间复杂度为O(n2), 适用于待排序元素较少的情况。,2.
7、8.3 选择排序 简单选择排序、堆排序,举例:图8-2-3,2020/9/7,14,2.8.3 选择排序 简单选择排序、堆排序。 1、简单选择排序 思想:首先从1n个元素中选出关键字最小的记录交换到第一个位置上。然后再从第2 个到第n个元素中选出次小的记录交换到第二个位置上,依次类推。 时间复杂度为O(n2), 适用于待排序元素较少的情况。,初态,8 3 9 1 6,8 3 9 1 6,8 3 9 1 6,8 3 9 1 6,1 3 9 8 6,1 3 9 8 6,1 3 9 8 6,2020/9/7,15,简单选择排序的算法如下: void SelectSort( RedType L ,in
8、t n) int i,j,k,t; for (i=1,i=n;+i) /*选择第i小的元素,并交换到位*/ k=i; for(j=i+1;j=n;+j) if ( Lj.keyLk.key) k=j; /*Lk 中存放的是第I小的元素*/ if(k!=i) t=Li; /*交换*/ Li=Lk; Lk=t ; /*FOR*/ /* SelectSort*/,2020/9/7,16,2堆排序也是一种选择排序。是具有特定条件的顺序存储的完全二叉树,其特定条件是:任何一个非叶子结点的关键字大于等于(或小于等于)子女的关键字的值。 (1) 堆的示例,(a):堆顶元素取最大值,(b):堆顶元素取最小值,
9、(2) 实现堆排序需解决两个问题: (1) 如何由一个无序序列建成一个堆? (2) 输出堆顶元素后,如何将剩余元素调整成一个新的堆?,举例:图8-2-4,2020/9/7,17,(3) 输出堆顶元素并调整建新堆的过程(筛选),把自堆顶至叶子的调整过程称为“筛选。从一个无序序列建堆的过程就是一个反复”筛选“的过程。,2020/9/7,18,(4)由无序序列建初始堆的过程,(c): 49被筛选后的状态,(d): 56被筛选后的状态,(e): 被筛选之后建成堆,2020/9/7,19,E、筛选算法(调整建堆) typedef Sqlist HeapType; /堆采用顺序表存储表示 void Hea
10、pAdjust( HeapType ,2020/9/7,20,typedef Sqlist HeapType; void HeapAdjust( HeapType ,2020/9/7,21,void HeapSort( HeapType /把H.r1.i-1重新调整为一个堆 ,F、堆排序算法,2020/9/7,22,A:,F、堆排序算法,2020/9/7,23,2020/9/7,24,2.8.4 交 换 排 序 交换排序的特点在于交换。有冒泡和快速排序两种。 1、冒泡排序(起泡排序) 思想:小的浮起,大的沉底。从左端开始比较。 第一趟:第1个与第2个比较,大则交换;第2个与第3个比较, 大则交
11、换,关键字最大的记录交换到最后一个位置上; 第二趟:对前n-1个记录进行同样的操作,关键字次大的记录交换 到第n-1个位置上; 依次类推,则完成排序。 正序:时间复杂度为O(n) 逆序:时间复杂度为O(n2) 适合于数据较少的情况。 排序n个记录的文件最多需要n-1趟冒泡排序。,举例:图8-2-5,2020/9/7,25,第 六 趟 排 序 后,第 五 趟 排 序 后,第 四 趟 排 序 后,第 三 趟 排 序 后,第 二 趟 排 序 后,第 一 趟 排 序 后,初 始 关 键 字,思想:小的浮起,大的沉底。,2020/9/7,26,冒泡排序的C程序段: Void bubsort(RedTyp
12、e L ,int n) int i,x,j=1,k=1; while (j0); k=0; for (i=1;i=n-j; i+) if (Li+1.keyLi.key) k+;x=Li;Li=Li+1;Li+1=x; j+; /*while*/ /*Bobsort*/,2020/9/7,27,2、快速排序 (对冒泡排序的改进) 思想:通过一趟排序将待排序列分成两部分,使其中一部分记录的关键字均比另一部分小,再分别对这两部分排序,以达到整个序列有序。 关键字通常取第一个记录的值为基准值。 做法:附设两个指针low和high ,初值分别指向第一个记录和最后一个记录,设关键字为 key ,首先从
13、high所指位置起向前搜索,找到第一个小于基准值的记录与基准记录交换,然后从low 所指位置起向后搜索,找到第一个大于基准值的记录与基准记录交换,重复这两步直至low=high为止。 时间复杂度:O(log2n),举例图8-2-6,2020/9/7,28,快速排序过程示意图:,有序序列 6 18 23 52 67,key,low,high,一次交换 18 52 6 67 23,low,high,二次交换 18 23 6 67 52,high,三次交换 18 6 23 67 52 / 完成一趟排序后分别进行快速排序,low,high,2020/9/7,29,2.8.5 归并排序,初始序列 23 52 67 6 18 10 一趟归并后 23 52 6 67 10 18 二趟归并后 6 23 52 67 10 18 三趟归并后 6 10 18 23 52 67,归并排序示例,功能:将两个或两个以上的有序表组成一个新的有序表。 思想:把具有n个记录的表看成是n个有序的子表,每个子表的长度为1,然后两两归并,得到n/2个长度为2或为1的有序子表;再两两归并,如此重复,直到得到一个长度为n的有序表为止。,2020/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中医馆基层医师业务试题(附答案)
- 主提升机副井司机安全操作规程培训
- 安全隐患整改通知单(表单模板)
- 井架安拆安全要求及措施培训课件
- 起重信号指挥安全操作规程培训
- 保证安全施工技术措施培训
- 油库消防安全系统培训
- 承压热水锅炉危险性分析与安全管理培训
- (2026年)学校教师培训制度
- 2025-2026学年湖南株洲醴陵一中高一下学期期末生物试题含答案
- 国家能源集团科研总院社会招聘参考题库新版
- GB/T 33061.10-2025塑料动态力学性能的测定第10部分:使用平行平板振动流变仪测定复数剪切黏度
- 井场作业应急预案(3篇)
- Q-SY 13034-2024 物料主数据数字化描述规范
- 2024年上海秋季高考语文真题含答案
- CQC17463416-2024建设工程用电缆燃烧性能分级认证实施规则
- OEE培训课件教学课件
- DB13(J)-T 8522-2023 承插型盘扣式钢管脚手架安全选用技术规程(京津冀)
- 创新教育评价体系的构建与实施
- 《信息组织》课程教学大纲
- 数据资产基础知识培训课件
评论
0/150
提交评论