第六章-交换类排序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,对它们进行冒泡升序排序。排序过程如下: 对它们进行冒泡升序排序 对它们进行冒泡升序排序。排序过程如下:
相关文档
最新文档