第六章-交换类排序
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一趟快速排序 目标:找一个记录,以它的关键字作为“枢轴” 基 目标:找一个记录,以它的关键字作为“枢轴”/”基 凡其关键字小于枢轴的记录均移动至该记录之前 关键字小于枢轴的记录均移动至该记录之前, 准”,凡其关键字小于枢轴的记录均移动至该记录之前, 反之, 关键字大于枢轴的记录均移动至该记录之后。 反之,凡关键字大于枢轴的记录均移动至该记录之后。 的记录均移动至该记录之后 无序的记录序列
if( flag) break; /*未交换,排序结束*/
} }
6.4 选择排序
假设排序过程中,待排记录序列的状态为: 有序序列R[1..i-1] 第i趟 简单选择排序 无序序列 R[i..n]
从中选出 关键字最小的记录
有序序列R[1..i]
无序序列 R[i+1..n]
6.4.1 简单选择排序
算法思路:对于一组关键字 , , , 算法思路:对于一组关键字(Kl,K2,…,kn), , 将其由小到大进行排序; 小到大进行排序 将其由小到大进行排序; 首先选出关键字最小的记录送到最前位置,再 首先选出关键字最小的记录送到最前位置, 选出关键字最小的记录送到最前位置 选关键字次小的记录送到第二个位置……直到 选关键字次小的记录送到第二个位置 直到 选完n个记录为止。 选完 个记录为止。 个记录为止
k 例 i=1 初始: [ 49 13
k 38 j k 65 j 97 j 97 j 97 [97 49 49 49 49 76 j 76 j 76 76 [76 65 65 65
k 13 49 j 27 ] j k
i=2 一趟: 13
[38 65 27 j
49 38 ] 27 j 49 49 97 [97 76 76 j 38 ] 65 ] 65 ] 76 ] [97 ] 97
已知,完全二叉树的第8层上 有9个结点,则其叶子结点数 为( )
第六章
6.3 6.4
排序
交换排序(冒泡排序、快速排序) 交换排序(冒泡排序、快速排序) 选择排序(简单选择排序) 选择排序(简单选择排序)
6.3 交换排序
交换排序主要是根据记录的关键字的大小, 交换排序主要是根据记录的关键字的大小,将 记录交换来进行排序的。 交换来进行排序的 记录交换来进行排序的。 交换排序:根据两两比较待排序记录的关键值, 交换排序:根据两两比较待排序记录的关键值, 两两比较待排序记录的关键值 交换不满足条件的那些偶对 不满足条件的那些偶对, 交换不满足条件的那些偶对,直到全部满足为 止。 这里介绍两种交换排序方法,它们是冒泡排序 这里介绍两种交换排序方法,它们是冒泡排序 快速排序。 和快速排序。
当排序 之中某 一趟 未发生过 记录交换, 记录交换,这 表明关键字已 经有序, 经有序,因此 不必要进行下 趟处理了
冒泡排序算法 void BubbleSort (int r[],int n) { for(i=1;i<n ;i++) 设交换标志, 为未交换*/ 设交换标志 为未交换 { flag=1; /*设交换标志,flag=1为未交换 for(j=1;j<=n-i;j++) { if( r[ j ] > r[ j+1 ] ) { flag=0; /* 已交换 */ r[0]=r[j];r[j]=r[j+1];r[j+1]=r[0]; } }
一种简单的交换排序——冒泡排序
例
49 38 38 49 65 97 76 76 13 97 13 97 27 27 30 97 38 49 65 76 13 38 49 65 13 38 49 13 13 49 27
13 38
13 27 38 27 38 30 30 38 49
13 27 30 38
简单选择排序是稳定的么? 简单选择排序是稳定的么?
简单选择排序是不稳定的排序。 简单选择排序是不稳定的排序。 不稳定的排序 例如:一个简单的序列 例如:一个简单的序列{ 21, 22,1 } 经过简单选择排序后序列: , 经过简单选择排序后序列:{1, 22, 21}
排序方法的稳定性能总结: 排序方法的稳定性能总结:
6.2.3 快速排序 (Quick Sort)
快速排序:是目前内排序中最快、 快速排序:是目前内排序中最快、最常用的排 序算法,是对冒泡排序算法的一个改进 是对冒泡排序算法的一个改进。 序算法 是对冒泡排序算法的一个改进。该算 法由霍尔( 法由霍尔(Hoare)于1962年提出的一种划分 ) 年提出的一种划分 交换排序。它采用了一种分治的策略 分治的策略, 交换排序。它采用了一种分治的策略,通常称 其为分治法。 其为分治法。 分治法的基本思想 分治法的基本思想是: 分治法的基本思想是:将原问题分解为若 干个规模更小但结构与原问题相似的子问题。 干个规模更小但结构与原问题相似的子问题。 递归地解这些子问题 地解这些子问题, 递归地解这些子问题,然后将这些子问题的解 组合为原问题的解。 组合为原问题的解。
稳定的排序方法指的是,对于两个关键字 相等的记录,它们在序列中的相对位置,在 排序之前和经过排序之后,没有改变。 快速排序、希尔排序、简单选择排序是不 快速排序、希尔排序、简单选择排序是不 稳定的排序法。 稳定的排序法
本章要点
排序的特性----稳定性、 排序的特性 稳定性、不稳定性 稳定性 排序的分类----插入排序 交换排序, 插入排序, 排序的分类 插入排序,交换排序,选择排 序。 插入排序----掌握直接插入排序 掌握直接插入排序、 插入排序 掌握直接插入排序、折半插入排 序的程序,希尔排序的策略(第一趟) 序的程序,希尔排序的策略(第一趟) 交换排序-----掌握冒泡排序的程序,快速排序 掌握冒泡排序的程序, 交换排序 掌握冒泡排序的程序 的策略(第一趟) 的策略(第一趟) 选择排序-----掌握简单选择排序的程序 选择排序 掌握简单选择排序的程序
第i趟冒泡排序 趟冒泡排序
假设在排序过程中,记录序列R[1..n] 的状态为: n-i+1
无序序列R[1..n-i+1] 有序序列 R[n-i+2..n]
比较相邻记录,将关 比较相邻记录 键字值大的记录交换 的记录交换 的记录 到 后面 后面的位置上
无序序列R[1..n-i]
第 i 趟起泡排序
有序序列 R[n-i+1..n]
6.2.3 快速排序 【演示】 演示】
来自百度文库 例如
s
R[0] 52
t
14 52 80 23 52 49 80 36 14 58 61 97 23 75
low low low low low highhigh high high high high
设 R[s]=52 为枢轴 将 R[high].key 和 枢轴的关键字进行比较, 要求R[high].key ≥ 枢轴的关键字 将 R[low].key 和 枢轴的关键字进行比较, 要求R[low].key ≤ 枢轴的关键字
一次划分
无序记录子序列(1) 无序记录子序列
基准
无序子序列(2) 无序子序列
分别进行快速排序
6.2.3 快速排序
设有一组关键字【 , , , , , , , 设有一组关键字【35,50,15,30,85,12,20, 70】,快速排序的排序过程: 】 快速排序的排序过程: 算法思路: 算法思路: (1)任选一个关键字(一般可选第一条记录) )任选一个关键字(一般可选第一条记录) (2)初始两个指针 )初始两个指针low和high,low指向待排序列 和 , 指向待排序列 的第一个值, 指向待排序列的最后一个值, 的第一个值,high指向待排序列的最后一个值, 指向待排序列的最后一个值 分别根基准元素比较,满足条件时交换 交换, 分别根基准元素比较,满足条件时交换,交换后需 换方向比较 比较。 要换方向比较。 (3)重复第一步和第二步,直到所有序列排序完 )重复第一步和第二步, 成。
下列排序算法中,某一趟结束后未必能选出一 下列排序算法中,某一趟结束后未必能选出一 未必 个元素放在其最终位置上的是() 个元素放在其最终位置上的是() A B C D 直接插入排序 冒泡排序 快速排序 选择排序
下列四种排序方法中,不稳定的方法是( 下列四种排序方法中,不稳定的方法是( )。 A.直接插入排序 B. 冒泡排序 . C.折半插入排序 D. 快速排序 .
快速排序算法是稳定的么? 快速排序算法是稳定的么?
快速排序法是不稳定的。 快速排序法是不稳定的。 不稳定的 举一个简单的例子 对 2,11,12 三个数进行快速排序 , 快速排序的结果是: 快速排序的结果是: 12 , 11 , 2
有一组关键字{14, , , , , 有一组关键字 ,15,30,28,5,10} 请写出按照递增次序,快速排序第一 递增次序 请写出按照递增次序,快速排序第一 趟结束时序列。 结束时序列。
按照递增次序, 按照递增次序,使用快速排序第一趟结束时的 序列为: 序列为: 【10,5】14 【28,30,15】
[练习 若一组记录的关键码为(46,79, 练习]若一组记录的关键码为 练习 若一组记录的关键码为( , , 56,38,40,84),则利用快速排序 ),则利用快速排序 , , , ), 的方法,以第一个记录为基准, 的方法,以第一个记录为基准,得到 第一趟快速排序的结果为( 第一趟快速排序的结果为( )。
二趟: 13 三趟: 13 四趟: 13 五趟: 13 六趟: 13 排序结束: 13
27 27 27 27 27 27
[65 38 38 38 38 38
简单选择排序
简单选择排序算法
void SelectSort(int r[ ],int n) { for(i=1;i<n;i++) { k=i; for(j=i+1;j<=n;j++) if( r[j]<r[k]) k=j; //将关键字值小的下标赋给k if(i!=k) { t=r[i]; r[i]=r[k]; r[k]=t; } } }
13 27 30
27 65 13
27 30 65 30 65 76
49 30 27 49 30
65
27 76 13 30 76 27 76 30
97
97 30 初 始 关 键 字
第 一 趟
第 二 趟
第 三 趟
第 四 趟
第 五 趟
第 六 趟
例:一组关键字{40,58,12,33,90,20,80,65}, 一组关键字 , , , , , , , , n=8,对它们进行冒泡升序排序。排序过程如下: 对它们进行冒泡升序排序 对它们进行冒泡升序排序。排序过程如下: