最新【考研计算机专业课】武汉大学数据结构PPT课件 第10章内排序(共88张PPT课件).pptx
《最新【考研计算机专业课】武汉大学数据结构PPT课件 第10章内排序(共88张PPT课件).pptx》由会员分享,可在线阅读,更多相关《最新【考研计算机专业课】武汉大学数据结构PPT课件 第10章内排序(共88张PPT课件).pptx(88页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第10章章 内内 排排 序序10.6 基数排序基数排序10.1 排序排序(pi x)的基本概念的基本概念10.2 插入排序插入排序10.3 交换交换(jiohun)排序排序10.4 选择选择(xunz)排序排序10.5 归并排序归并排序10.7 各种内排序方法的比较和选择各种内排序方法的比较和选择第一页,共八十八页。10.1 排序的基本概念排序的基本概念 所谓排序所谓排序,就是要整理表中的记录就是要整理表中的记录,使之按关键字递增使之按关键字递增(或递减或递减)有序排列有序排列(pili)。其确切定义如下:。其确切定义如下: 输入:输入:n个记录个记录,R0,R1,Rn-1,其相应的关键字分
2、别为其相应的关键字分别为k0,k1,kn-1。 输出:输出:Ri , 0,Ri , 1,Ri , n - 1,使得使得ki , 0ki , 1ki , n - 1 (或或ki,0ki,1ki,n-1)。本章仅考虑递增本章仅考虑递增(dzng)排序排序第二页,共八十八页。 当待排序记录的关键字均不相同时,排序的结果是惟一的当待排序记录的关键字均不相同时,排序的结果是惟一的, ,否则排否则排序的结果不一定唯一。如果待排序的表中序的结果不一定唯一。如果待排序的表中, ,存在有多个关键字相同的记存在有多个关键字相同的记录录, ,经过排序后这些具有相同关键字的记录之间的相对次序保持不变经过排序后这些具有
3、相同关键字的记录之间的相对次序保持不变, ,则称这种排序方法是则称这种排序方法是稳定稳定(wndng)(wndng)的;反之的;反之, ,若具有相同关键字的记录若具有相同关键字的记录之间的相对次序发生变化之间的相对次序发生变化, ,则称这种排序方法是则称这种排序方法是不稳定不稳定的。的。 在排序过程中,若整个表都是放在内存中处理,排序时不涉及数在排序过程中,若整个表都是放在内存中处理,排序时不涉及数据据(shj)的内、外存交换,则称之为的内、外存交换,则称之为内排序内排序;反之,若排序过程中;反之,若排序过程中要进行数据的内、外存交换,则称之为要进行数据的内、外存交换,则称之为外排序外排序。
4、算法算法(sun f)的稳定性的稳定性内排序和外排序内排序和外排序第三页,共八十八页。内排序的基本内排序的基本(jbn)方法方法内部排序内部排序(pi x)的过程是一个逐步扩大记录的有序序列的过程是一个逐步扩大记录的有序序列长度的过程。长度的过程。经过经过(jnggu)一趟排一趟排序序有序序列区无 序 序 列 区有序序列区无 序 序 列 区第四页,共八十八页。正序和反序正序和反序若待排序的表中元素已按关键字排好序,称此表中元素为正若待排序的表中元素已按关键字排好序,称此表中元素为正序;反之,若待排序的表中元素的关键字顺序正好序;反之,若待排序的表中元素的关键字顺序正好(zhngho)和排好和排
5、好序的顺序相反,称此表中元素为反序。序的顺序相反,称此表中元素为反序。排序的分类排序的分类根据排序算法是否基于关键字的比较,将排序算法分为基于比较根据排序算法是否基于关键字的比较,将排序算法分为基于比较的排序算法和不基于比较的排序算法。像插入排序、交换排序、选择的排序算法和不基于比较的排序算法。像插入排序、交换排序、选择(xunz)排序和归并排序都是基于比较的排序算法;而基数排序是不基排序和归并排序都是基于比较的排序算法;而基数排序是不基于比较的排序算法。于比较的排序算法。第五页,共八十八页。 待排序的顺序表类型待排序的顺序表类型(lixng)的类型的类型(lixng)定义如下:定义如下: t
6、ypedef int KeyType; /定义关键字类型定义关键字类型 typedef struct /记录类型记录类型 KeyType key; /关键字项关键字项 InfoType data; /其他数据项其他数据项,类型为类型为InfoType RecType; /排序的记录类型定义排序的记录类型定义 存放数据的结构存放数据的结构(jigu):第六页,共八十八页。10.2 插入排序插入排序 插入排序的基本思想是:每次将一个待排序的记录插入排序的基本思想是:每次将一个待排序的记录, ,按其关键字按其关键字大小插入到前面已经排好序的子表中的适当位置大小插入到前面已经排好序的子表中的适当位置,
7、 ,直到全部记录插入直到全部记录插入完成为止完成为止(wizh)(wizh)。 两种插入排序方法:两种插入排序方法: (1 1)直接插入排序(含二分插入排序)直接插入排序(含二分插入排序) (2 2)希尔排序)希尔排序第七页,共八十八页。10.2.1 直接插入排序直接插入排序 假设待排序的记录存放在数组假设待排序的记录存放在数组R0.n-1中,排序过程的某一中,排序过程的某一中间时刻,中间时刻,R被划分成两个子区间被划分成两个子区间R0.i-1和和Ri.n-1,其中:前,其中:前一个一个(y )子区间是已排好序的有序区,后一个子区间是已排好序的有序区,后一个(y )子区间则是当子区间则是当前未
8、排序的部分,不妨称其为无序区。前未排序的部分,不妨称其为无序区。 直接插入排序的基本操作是将当前无序区的第直接插入排序的基本操作是将当前无序区的第1个记录个记录Ri插入到有序插入到有序区区R0.i-1中适当的位置上,使中适当的位置上,使R0.i变为新的有序区。这种方法通常称为变为新的有序区。这种方法通常称为增量法增量法,因为它每次使有序区增加,因为它每次使有序区增加1个记录。个记录。 第八页,共八十八页。 R0Ri-1 有序区有序区 RiRn-1 无序区无序区 一趟排序一趟排序 R0Ri-1 Ri Ri+1Rn-1 有序区有序区 无序区无序区 第九页,共八十八页。R0jRij=i-1插入插入(
9、ch r)位置位置在有序区中插入在有序区中插入(ch r)Ri的过程的过程第十页,共八十八页。void InsertSort(RecType R,int n) /对对R0.n-1按递增有序进行按递增有序进行(jnxng)直接插入排序直接插入排序 int i,j;RecType temp; for (i=1;i=0 & temp.keyj且且Ri.key=Rj.key时,本算法将时,本算法将Ri插入在插入在Rj的后面的后面(hu mian),使,使Ri和和Rj的相对位置保持不变,所以直接插的相对位置保持不变,所以直接插入排序是一种稳定的排序方法。入排序是一种稳定的排序方法。第十四页,共八十八页。
10、10.2.2 二分二分(r fn)插入排序插入排序查找采用查找采用(ciyng)二分查找方法,称为二分插入排序或折半插入排序。二分查找方法,称为二分插入排序或折半插入排序。void InsertSort1(RecType R,int n)int i,j,low,high,mid; RecType tmp; for (i=1;in;i+) tmp=Ri; /将将Ri保存到保存到tmp中中low=0;high=i-1;while (low=high) /在在Rlow.high中查找插入的位置中查找插入的位置 mid=(low+high)/2;/取中间位置取中间位置 if (tmp.key=high
11、+1;j-)/记录后移记录后移 Rj+1=Rj;Rhigh+1=tmp;/插入插入 第十五页,共八十八页。10.2.3 希尔排序希尔排序 希尔排序也是一种插入排序方法希尔排序也是一种插入排序方法,实际上是一种分组插入方法。实际上是一种分组插入方法。 基本思想:基本思想: 先取定一个小于先取定一个小于n的整数的整数d1作为第一个增量,把表的全部记录分成作为第一个增量,把表的全部记录分成d1个组,所有距离个组,所有距离(jl)为为d1的倍数的记录放在同一个组中,在各组内的倍数的记录放在同一个组中,在各组内进行直接插入排序;进行直接插入排序; 然后然后,取第二个增量取第二个增量d2(d1),重复上述
12、的分组和排序,直至),重复上述的分组和排序,直至所取的增量所取的增量dt=1(dtdt-1d20) for (i=d;i=0 & Rj.keyRj+d.key) temp=Rj; /Rj与与Rj+d交换交换(jiohun) Rj=Rj+d;Rj+d=temp; j=j-d; d=d/2; /递减增量递减增量d 第十九页,共八十八页。 例例10.2 设待排序的表有设待排序的表有10个记录个记录,其关键字分别为其关键字分别为9,8,7,6,5,4,3,2,1,0。说明采用说明采用(ciyng)希尔排序方法进行排序的过程。希尔排序方法进行排序的过程。 9 8 7 6 5 4 3 2 1 0 初始状态
13、初始状态 (连线部分为下一趟作准备连线部分为下一趟作准备) 4 3 2 1 0 9 8 7 6 5 d=5 (d=5 执行结果执行结果) 0 1 2 3 4 5 6 7 8 9 d=2 (d=2 执行结果执行结果) 0 1 2 3 4 5 6 7 8 9 d=1 (d=1 执行结果执行结果) 第二十页,共八十八页。希尔排序的时间复杂度约为希尔排序的时间复杂度约为O(n1.3)。为什么希尔排序比直接插入排序好?为什么希尔排序比直接插入排序好?例如例如(lr):有:有10个元素要排序。个元素要排序。希尔排序希尔排序(pi x)直接直接(zhji)插入排插入排序序大约时间大约时间=102=100d=
14、5:分为:分为5组,时间约为组,时间约为5*2220d=2:分为:分为2组,时间约为组,时间约为2*5250d=1:分为:分为1组,几乎有序,时间约为组,几乎有序,时间约为1080第二十一页,共八十八页。希尔排序算法不稳定的反例希尔排序算法不稳定的反例希尔排序法是一种不稳定的排序算法。希尔排序法是一种不稳定的排序算法。例如,若希尔排序分为两组:例如,若希尔排序分为两组:3,10,7,8,20和和5,8,2,1,6,显然,第,显然,第1组的组的8排列排列(pili)在第在第2组的组的8的后面,两组采用直接插入排序后的结果的后面,两组采用直接插入排序后的结果为:为:3,7,8,10,20和和1,2
15、,5,6,8,这样第,这样第1组的组的8排列到第排列到第2组的组的8的前的前面,它们的相对位置发生了改变。面,它们的相对位置发生了改变。第二十二页,共八十八页。思考题:思考题:希尔排序希尔排序(pi x)中的有序区是全局有序吗?中的有序区是全局有序吗?第二十三页,共八十八页。10.3 交换交换(jiohun)排序排序 交换排序的基本思想:两两比较待排序记录的关键字交换排序的基本思想:两两比较待排序记录的关键字,发现两个记录发现两个记录的次序相反时即进行交换的次序相反时即进行交换,直到没有反序的记录为止。直到没有反序的记录为止。 两种交换排序两种交换排序: (1)冒泡排序)冒泡排序 (2)快速排
16、序)快速排序第二十四页,共八十八页。10.3.1 冒泡排序冒泡排序 冒泡排序的基本思想冒泡排序的基本思想:通过无序区中相邻记录关键字间的比:通过无序区中相邻记录关键字间的比较和位置的交换,使关键字最小的记录如气泡一般逐渐往上较和位置的交换,使关键字最小的记录如气泡一般逐渐往上“漂浮漂浮”直至直至(zhzh)“水面水面”。 整个算法是从最下面的记录开始,对每两个相邻的关键字进行整个算法是从最下面的记录开始,对每两个相邻的关键字进行比较比较,且使关键字较小的记录换至关键字较大的记录之上,使得经且使关键字较小的记录换至关键字较大的记录之上,使得经过一趟冒泡排序后,关键字最小的记录到达最上端,接着再在
17、剩下过一趟冒泡排序后,关键字最小的记录到达最上端,接着再在剩下的记录中找关键字次小的记录,并把它换在第二个位置上。依次类的记录中找关键字次小的记录,并把它换在第二个位置上。依次类推,一直到所有记录都有序为止。推,一直到所有记录都有序为止。第二十五页,共八十八页。 一趟排序一趟排序 R0 有序区有序区 无序区无序区 Ri-1 Ri Rn-1 Ri+1 R0 Ri Ri-1 将无序区中将无序区中最小记录放最小记录放在在 Ri Ri+1 Rn-1 有序区有序区 无序区无序区 第二十六页,共八十八页。void BubbleSort(RecType R,int n) int i,j;RecType te
18、mp; for (i=0;ii;j-) /比较找本趟最小关键字的记录比较找本趟最小关键字的记录(jl) if (Rj.keyRj-1.key) temp=Rj; /Rj与与Rj-1进行交换进行交换 Rj=Rj-1; Rj-1=temp; 第二十七页,共八十八页。 例例10.3 设待排序的表有设待排序的表有10个记录个记录,其关键字分别为其关键字分别为9,8,7,6,5,4,3,2,1,0。说明采用冒泡排序方法说明采用冒泡排序方法(fngf)进行排序的过程。进行排序的过程。 初始关键字初始关键字 9 8 7 6 5 4 3 2 1 0 i=0 0 9 8 7 6 5 4 3 2 1 i=1 0
19、1 9 8 7 6 5 4 3 2 i=2 0 1 2 9 8 7 6 5 4 3 i=3 0 1 2 3 9 8 7 6 5 4 i=4 0 1 2 3 4 9 8 7 6 5 i=5 0 1 2 3 4 5 9 8 7 6 i=6 0 1 2 3 4 5 6 9 8 7 i=7 0 1 2 3 4 5 6 7 9 8 i=8 0 1 2 3 4 5 6 7 8 9 第二十八页,共八十八页。思考题:思考题:冒泡冒泡排序排序(pi x)中的有序区是全局有序吗?中的有序区是全局有序吗?第二十九页,共八十八页。 在有些情况下,在第在有些情况下,在第i(in-1)趟时已排好序了,但仍执行)趟时已排好
20、序了,但仍执行后面几趟的比较。实际上,一旦算法中某一趟比较时不出现记后面几趟的比较。实际上,一旦算法中某一趟比较时不出现记录交换录交换,说明已排好序了,就可以结束本算法。说明已排好序了,就可以结束本算法。 为此为此(wi c)得到改进冒泡排序算法如下:得到改进冒泡排序算法如下:第三十页,共八十八页。void BubbleSort(RecType R,int n) int i,j,exchange;RecType temp; for (i=0;ii;j-)/比较比较(bjio),找出最小关键字的找出最小关键字的记录记录 if (Rj.keyRj-1.key) temp=Rj; Rj=Rj-1;R
21、j-1=temp; exchange=1; if (exchange=0) return; /中途结束算法中途结束算法 第三十一页,共八十八页。最好的情况最好的情况(qngkung)(关键字在记录序列中顺序有序):(关键字在记录序列中顺序有序): 只需进行一趟冒泡只需进行一趟冒泡“比较比较(bjio)”的次数:的次数:最坏的情况(关键字在记录最坏的情况(关键字在记录(jl)序列中逆序有序):序列中逆序有序): 需进行需进行n-1趟冒泡趟冒泡“比较比较”的次数:的次数:0“移动移动”的次数:的次数:“移动移动”的次数:的次数:n-121110)n(n)in(ni 2131320)n(n)in(n
22、i 第三十二页,共八十八页。10.3.2 快速排序快速排序 快速排序是由冒泡排序改进而得的。快速排序是由冒泡排序改进而得的。 基本思想基本思想(sxing)(sxing):在待排序的:在待排序的n n个记录中任取一个记录个记录中任取一个记录( (通常取第一通常取第一个记录个记录) ),把该记录放入适当位置后,把该记录放入适当位置后, ,数据序列被此记录划分成两部分。所数据序列被此记录划分成两部分。所有关键字比该记录关键字小的记录放置在前一部分有关键字比该记录关键字小的记录放置在前一部分, ,所有比它大的记录放所有比它大的记录放置在后一部分置在后一部分, ,并把该记录排在这两部分的中间并把该记录
23、排在这两部分的中间( (称为该记录归位称为该记录归位) ),这个,这个过程称作一趟快速排序。过程称作一趟快速排序。 第三十三页,共八十八页。 首先首先(shuxin)对无序的记录序列进行对无序的记录序列进行“一次划分一次划分”,之后分别对分割所得两,之后分别对分割所得两个子序列个子序列“递归递归”进行快速排序。进行快速排序。无 序 的 记 录 序 列无序记录(jl)子序列(1)无序(w x)子序列(2)基准基准一次划分分别进行快速排序需要确定排序的序列,采用什么存储结构?需要确定排序的序列,采用什么存储结构?第三十四页,共八十八页。52 49 80 36 14 58 61 97 23 75st
24、lowhigh设设 Rs=52 为枢轴为枢轴(sh zhu) 将将 Rhigh.key 和基准的关键字进行比较和基准的关键字进行比较(bjio),要求,要求Rhigh.key 基基准的关键字准的关键字 将将 Rlow.key 和基准和基准(jzhn)的关键字进行比较,要求的关键字进行比较,要求Rlow.key 基基准的关键字准的关键字high23low80high14low52例如例如R052lowhighhighhighlow第三十五页,共八十八页。 可见,经过可见,经过(jnggu)“一次划分一次划分” ,将关键字序列,将关键字序列 52, 49, 80, 36, 14, 58, 61,
25、97, 23, 75 调整为调整为: 23, 49, 14, 36, (52) 58, 61, 97, 80, 75 在调整在调整(tiozhng)过程中,设立了两个指针:过程中,设立了两个指针: low 和和high,它们的初值分,它们的初值分别为:别为: s 和和 t。 之后逐渐减小之后逐渐减小 high,增加,增加(zngji) low,并保证,并保证 Rhigh.key52,和,和 Rlow.key52, ,否则进行记录的否则进行记录的“交换交换”。第三十六页,共八十八页。 以后对所有的两部分分别重复上述过程,直至每部分内只有以后对所有的两部分分别重复上述过程,直至每部分内只有一个记录
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 考研计算机专业课 最新【考研计算机专业课】武汉大学数据结构PPT课件 第10章 内排序共88张PPT课件 最新 考研 计算机 专业课 武汉大学 数据结构 PPT 课件 10 排序 88
链接地址:https://www.taowenge.com/p-33410617.html
限制150内