Upload
yan-li
View
239
Download
6
Embed Size (px)
Citation preview
《数据结构( Java 版)(第 3 版)》
第 9 章 排序 9.1 排序的基本概念 9.2 插入排序 9.3 交换排序
9.4 选择排序
9.5 归并排序
9.6 单链表的排序算法
《数据结构( Java 版)(第 3 版)》
目的和要求 目的:排序算法研究。对于数据逻辑结构是线性表、存储
结构是顺序、操作是排序,体会各种不同算法实现。• 内容:介绍插入、交换、选择、归并等多种经典排序算法,
讨论各种排序算法所适用的存储结构,以及比较各 排序算法的性能。
• 要求:掌握直接插入、冒泡、直接选择等排序算法及其性能, 理解希尔、快速、堆、归并等排序算法的设计思想及
算法实现,熟悉提高算法性能的各种手段。• 重点:每种排序算法设计思想,算法表达,算法分析与性能评
价。• 难点:希尔、快速、堆、归并等排序算法,性能较高算法的
共同特点。• 实验:排序算法设计及分析。
《数据结构( Java 版)(第 3 版)》
9.1 排序的基本概念1. 排序的数据序列与关键字2. 排序算法的性能评价
排序算法的时间复杂度由算法执行中的元素比较次数和移动次数决定。
3. 排序算法的稳定性 设有 ai和 aj ( i<j ), ai 位于 aj 之前,它们的关
键字相等 ki =kj ;排序后,如果 ai 仍在 aj 之前,则称这样的排序算法是稳定的,否则是不稳定的。
4. 内排序与外排序
《数据结构( Java 版)(第 3 版)》
9.2 插入排序
9.2.1 直接插入排序和折半插入排序
9.2.2 希尔排序
《数据结构( Java 版)(第 3 版)》
9.2.1 直接插入排序
1. 直接插入排序算法
《数据结构( Java 版)(第 3 版)》
2. 直接插入排序算法分析 <1> 数据序列已排序 {1,2,3,4,5,6} (最好情
况)的时间复杂度为 O(n) 。<2> 数据序列反序排列 {6,5,4,3,2,1} (最坏
情况)的时间复杂度为 。<3> 数据序列随机排列的时间复杂度为 。)( 2nO
n
i
nnn
iC
1
22
41
4
3
4
1
2
1
n
i
nnniM
1
2
44
)1(
2
)( 2nO
《数据结构( Java 版)(第 3 版)》
3. 折半插入排序 用折半查找代替直接插入排序中的顺序查找
《数据结构( Java 版)(第 3 版)》
9.2.2 希尔排序
《数据结构( Java 版)(第 3 版)》
9.3 交换排序
9.3.1 冒泡排序
9.3.2 快速排序
《数据结构( Java 版)(第 3 版)》
9.3.1 冒泡排序
《数据结构( Java 版)(第 3 版)》
9.3.2 快速排序
《数据结构( Java 版)(第 3 版)》
快速排序过程
《数据结构( Java 版)(第 3 版)》
9.4 选择排序
9.4.1 直接选择排序
9.4.2 堆排序
《数据结构( Java 版)(第 3 版)》
9.4.1 直接选择排序
1
1
2
22
)1()(
n
i
nnninC
38 97 26 19 5关键字序列
第1趟
38*
i min
{5} 97 26 19 38* 38
第2趟 {5 19} 26 97 38* 38
第3趟 {5 19 26} 97 38* 38
第4趟 {5 19 26 38*} 97 38
第5趟 {5 19 26 38* 38 97}
《数据结构( Java 版)(第 3 版)》
9.4.2 堆排序
12
,,2,1,02212
nikkkk iiii 且
《数据结构( Java 版)(第 3 版)》
( 1 )创建最小堆 81
49 38
27 97 76 19
13
(a)将关键字序列看成是完全二叉树的层次序列,调整以27为根的子树
关键字序列 {81, 49, 38, 27, 97, 76, 19, 13}
0
1 2
3 4 5 6
7
{13, 27, 19, 49, 97, 76, 38, 81}
i
j
上移
81
49 38
13 97 76 19
27
(b)调整以38为根的子树
关键字序列 {81, 49, 38, 13, 97, 76, 19, 27}
0
1 2
3 4 5 6
7
i
j以此为根的子树是最小堆
81
49 19
13 97 76 38
27
(c)调整以49为根的子树
关键字序列 {81, 49, 19, 13, 97, 76, 38, 27}
0
1 2
3 4 5 6
7
i
j49temp
81
13 19
27 97 76 38
49
(d)调整以81为根的子树
{81, 13, 19, 27, 97, 76, 38, 49}
0
1 2
3 4 5 6
7
i
j81
13
27 19
49 97 76 38
81
(e)最小堆
《数据结构( Java 版)(第 3 版)》
( 2)堆排序
最小堆 {13, 27, 19, 49, 97, 76, 38, 81}
(a)将最小值13交换到最后,再调整 (b)第1趟 {19,27,38,49,97,76,81, 13}
81
27 19
49 97 76 38
13
0
1 2
3 4 5 6
7
i
jtemp81
(c)将根值19交换到后面,再调整 (d)第2趟 {27,49,38,81,97,76, 19,13}
19
27 38
49 97 76 81
13
0
1 2
3 4 5 6
7
81
27 38
49 97 76 19
13
0
1 2
3 4 5 6
7
i
j81
27
49 38
81 97 76 19
13
0
1 2
3 4 5 6
7
《数据结构( Java 版)(第 3 版)》
9.5 归并排序
《数据结构( Java 版)(第 3 版)》
一次归并
《数据结构( Java 版)(第 3 版)》
9.6 单链表的排序算法 1. 单链表的直接插入排序 2. 单链表的直接选择排序
min
(b)一趟直接选择,min指向最小值结点,将min结点从原位置删除并插入到排序单链表的尾srear之后
head
(a)一条单链表各变量的初始状态,p遍历单链表比较,pfront指向p的前驱;min记得最小值结点,mfront指向min的前驱;srear指向排序单链表的最后一个结点
mfront
26 66 97 11 19 49 ∧38
head26
srear
66 4997 11 19 ∧38
11
srear
(c)重复执行上一步,在从srear.next开始的单链表中再找一个最小值结点链入srear之后
head11 26 66 97 19 49 38 ∧
minmfront ppfront
p==nullpfront
min
srear
minmfront p==nullpfront
19min
《数据结构( Java 版)(第 3 版)》
3. 单链表的归并算法
(c)将list单链表中剩余结点并入当前链表尾
this.head21
front
(b)等值结点前插入
p
36list.head
4711
q
36
q
76
36this.head
15
front
(a)建立两条排序单链表,将list中结点依次归并到当前单链表(this)中
p
36list.head
4711
q
21
q
76
this.head15
front p==null
36list.head
4711
q21
76
53 ∧
15 53 ∧
36 53
99 ∧
99 ∧
99 ∧