Top Banner
数数数数 Java 数 )( 3数第9第 第第 9.1 第第第第第第第 9.2 第第第第 9.3 第第第第 9.4 第第第第 9.5 第第第第 9.6 第第第第第第第第
21

第09章 排序(java版)

Jun 20, 2015

Download

Documents

Yan Li
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

第 9 章 排序 9.1 排序的基本概念 9.2 插入排序 9.3 交换排序

9.4 选择排序

9.5 归并排序

9.6 单链表的排序算法

Page 2: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

目的和要求 目的:排序算法研究。对于数据逻辑结构是线性表、存储

结构是顺序、操作是排序,体会各种不同算法实现。• 内容:介绍插入、交换、选择、归并等多种经典排序算法,

讨论各种排序算法所适用的存储结构,以及比较各 排序算法的性能。

• 要求:掌握直接插入、冒泡、直接选择等排序算法及其性能, 理解希尔、快速、堆、归并等排序算法的设计思想及

算法实现,熟悉提高算法性能的各种手段。• 重点:每种排序算法设计思想,算法表达,算法分析与性能评

价。• 难点:希尔、快速、堆、归并等排序算法,性能较高算法的

共同特点。• 实验:排序算法设计及分析。

Page 3: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.1 排序的基本概念1. 排序的数据序列与关键字2. 排序算法的性能评价

排序算法的时间复杂度由算法执行中的元素比较次数和移动次数决定。

3. 排序算法的稳定性 设有 ai和 aj ( i<j ), ai 位于 aj 之前,它们的关

键字相等 ki =kj ;排序后,如果 ai 仍在 aj 之前,则称这样的排序算法是稳定的,否则是不稳定的。

4. 内排序与外排序

Page 4: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.2 插入排序

9.2.1 直接插入排序和折半插入排序

9.2.2 希尔排序

Page 5: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.2.1 直接插入排序

1. 直接插入排序算法

Page 6: 第09章  排序(java版)

《数据结构( 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

Page 7: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

3. 折半插入排序 用折半查找代替直接插入排序中的顺序查找

Page 8: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.2.2 希尔排序

Page 9: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.3 交换排序

9.3.1 冒泡排序

9.3.2 快速排序

Page 10: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.3.1 冒泡排序

Page 11: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.3.2 快速排序

Page 12: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

快速排序过程

Page 13: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.4 选择排序

9.4.1 直接选择排序

9.4.2 堆排序

Page 14: 第09章  排序(java版)

《数据结构( 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}

Page 15: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.4.2 堆排序

12

,,2,1,02212

nikkkk iiii 且

Page 16: 第09章  排序(java版)

《数据结构( 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)最小堆

Page 17: 第09章  排序(java版)

《数据结构( 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

Page 18: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

9.5 归并排序

Page 19: 第09章  排序(java版)

《数据结构( Java 版)(第 3 版)》

一次归并

Page 20: 第09章  排序(java版)

《数据结构( 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

Page 21: 第09章  排序(java版)

《数据结构( 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 ∧