第9章排序 ★排序定义—将一个数据元素(或记录)的任意 序列,重新排列成一个按关键字有序的序列叫 ★排序分类 ◆按待排序记录所在位置 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序 今按排序依据原则 ●插入排序:直接插入排序、折半插入排序、希尔排序 ●交换排序:冒泡排序、快速排序 ●选择排序:简单选择排序、堆排序 ●归并排序:2路归并排序 ●基数排序
第9章 排序 排序定义——将一个数据元素(或记录)的任意 序列,重新排列成一个按关键字有序的序列叫~ 排序分类 ❖按待排序记录所在位置 ⚫内部排序:待排序记录存放在内存 ⚫外部排序:排序过程中需对外存进行访问的排序 ❖按排序依据原则 ⚫插入排序:直接插入排序、折半插入排序、希尔排序 ⚫交换排序:冒泡排序、快速排序 ⚫选择排序:简单选择排序、堆排序 ⚫归并排序:2-路归并排序 ⚫基数排序
今按排序所需工作量 ●简单的排序方法:T(n)=O(n2) ●先进的排序方法:T(n)=O(ogn) ●基数排序:T(n)=O(dn) ★排序基本操作 今比较两个关键字大小 今将记录从一个位置移动到另一个位置
❖按排序所需工作量 ⚫简单的排序方法:T(n)=O(n²) ⚫先进的排序方法:T(n)=O(logn) ⚫ 基数排序:T(n)=O(d.n) 排序基本操作 ❖比较两个关键字大小 ❖将记录从一个位置移动到另一个位置
§9.1交换排序 ★冒泡排序 今排序过程 将第一个记录的关键字与第二个记录的关键字进行比较,若 为逆序[1key>[2]key,则交换;然后比较第二个记录与第 个记录;依次类推,直至第n1个记录和第n个记录比较为 止——第一趟冒泡排序,结果关键字最大的记录被安置在最 后一个记录上 ●对前η-1个记录进行第二趟冒泡排序,结果使关键字次大的记 录被安置在第n∩-1个记录位置 ●重复上述过程,直到“在一趟排序过程中没有进行过交换记 录的操作”为止
§9.1 交换排序 冒泡排序 ❖排序过程 ⚫将第一个记录的关键字与第二个记录的关键字进行比较,若 为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与第 三个记录;依次类推,直至第n-1个记录和第n个记录比较为 止——第一趟冒泡排序,结果关键字最大的记录被安置在最 后一个记录上 ⚫对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记 录被安置在第n-1个记录位置 ⚫重复上述过程,直到“在一趟排序过程中没有进行过交换记 录的操作”为止
例38383838131313 49494913272727 6565 2730 3030 76 132730 38 38 13 273049 49 U 30 27 3065 3065 3076 3076 97 第第第第 初始关键字 儿u 第五趟一 第六趟
例 49 38 65 97 76 13 27 30初始关键字 38 49 65 76 13 27 30 97第一趟 38 49 65 13 27 30 76第二趟 38 49 13 27 30 65第三趟 38 13 27 30 49第四趟 13 27 30 38第五趟 13 27 30第六趟 38 49 76 9713 972 9730 97 13 76 76 7627 30 13 6527 6530 65 13 13 49 4930 4927 3827 380 38
今算法描述 Ch8 txt 今算法评价 ●时间复杂度 ◆最好情况(正序) 比较次数:n-1 移动次数:0 ◆最坏情况(逆序) 比较次数:(n-)=1(m2-n) 移动次数:3(n-0)=3(m2-n) T(n)=O(n2) Ch8 4.c
❖算法描述 ❖算法评价 ⚫时间复杂度 ◆最好情况(正序) 比较次数:n-1 移动次数:0 ◆最坏情况(逆序) 比较次数: ( ) 2 1 ( ) 2 1 1 n i n n n i − = − − = 移动次数: ( ) 2 3 3 ( ) 2 1 n i n n n i − = − = T(n)=O(n²) Ch8_4.c
★快速排序 ◆基本思想:通过一趟排序,将待排序记录分割成独立 的两部分,其中一部分记录的关键字均比另一部分记 录的关键字小,则可分别对这两部分记录冼行排序 以达到整个序列有序 ◇排序过程:对「[s…中记录进行一趟快速排序,附 设两个指针,设枢轴记录rp=[s],X=rp.key ●初始时令=S 首先从j所指位置向前搜索第一个关键字小于Ⅻ的记录,并和[p 交换 ●再从所指位置起向后搜索,找到第一个关键字大于Ⅺ的记录, 和p交换 ●重复上述两步,直至|为止 再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
快速排序 ❖基本思想:通过一趟排序,将待排序记录分割成独立 的两部分,其中一部分记录的关键字均比另一部分记 录的关键字小,则可分别对这两部分记录进行排序, 以达到整个序列有序 ❖排序过程:对r[s……t]中记录进行一趟快速排序,附 设两个指针i和j,设枢轴记录rp=r[s],x=rp.key ⚫初始时令i=s,j=t ⚫首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp 交换 ⚫再从i所指位置起向后搜索,找到第一个关键字大于x的记录, 和rp交换 ⚫重复上述两步,直至i==j为止 ⚫再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
例初始关键字:273813 4976976550 完成一趟排序:(273813)49(76976550) 分别进行快速排序:(13)27(38)49(5065)76(97) 快速排序结束:1327384950657697
例 初始关键字: 49 38 65 97 76 13 27 50 i j x j 完成一趟排序: ( 27 38 13) 49 (76 97 65 50) 分别进行快速排序: ( 13) 27 (38) 49 (50 65) 76 (97) 快速排序结束: 13 27 38 49 50 65 76 97 27 49 i i j j i 49 65 j 13 49 i 49 97 i j
◆算法描述 Ch8 5 txt 今算法评价 ●时间复杂度 ◆最好情况(每次总是选到中间值作枢轴)T(n)=O( nlog2n) ◆最坏情况(每次总是选到最小或最大元素作枢轴) T(n)=O(n2) T(n)=O(n2) Ch85.c
❖算法描述 ❖算法评价 ⚫时间复杂度 ◆最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) ◆最坏情况(每次总是选到最小或最大元素作枢轴) T(n)=O(n²) T(n)=O(n²) Ch8_5.c
§9.2插入排序 ★直接插入排序 今排序过程:整个排序过程为η-1趟插入,即先将序列 中第1个记录看成是一个有序子序列,然后从第2个记 录开始,逐个进行插入,直至整个序列有序 ◆算法描述 CH8 1.txt
§9.2 插入排序 直接插入排序 ❖排序过程:整个排序过程为n-1趟插入,即先将序列 中第1个记录看成是一个有序子序列,然后从第2个记 录开始,逐个进行插入,直至整个序列有序 ❖算法描述
例 1(49386597761327 Ch8 1.trt i=238(3849)6597761327 i=365(384965)97761327 497(38496597)761327 i=576(3849657697)1327 613(133849657697)27 i=727(13273849657697 排序结果:(13273849657697
例 49 38 65 97 76 13 27 i=2 38 (38 49) 65 97 76 13 27 i=3 65 (38 49 65) 97 76 13 27 i=4 97 (38 49 65 97) 76 13 27 i=5 76 (38 49 65 76 97) 13 27 i=6 13 (13 38 49 65 76 97) 27 i=1 ( ) i=7 (13 38 49 65 76 97) 27 27 j j j j j j 27 38 49 65 76 97 排序结果:(13 27 38 49 65 76 97)