数据结构李云清杨庆红揭安全学习教案.pptx
《数据结构李云清杨庆红揭安全学习教案.pptx》由会员分享,可在线阅读,更多相关《数据结构李云清杨庆红揭安全学习教案.pptx(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据结构数据结构(sh j ji u)李云清李云清 杨庆红杨庆红 揭安全揭安全第一页,共50页。第10章 内排序(pi x)排序是数据处理过程排序是数据处理过程(guchng)(guchng)中经常使用的一种重中经常使用的一种重要的运算,排序的方法有很多种,本章主要讨论内排序的要的运算,排序的方法有很多种,本章主要讨论内排序的各种算法,并对每个排序算法的时间和空间复杂性以及算各种算法,并对每个排序算法的时间和空间复杂性以及算法的稳定性等进行了讨论。法的稳定性等进行了讨论。10.1 排序排序(pi x)的基本概念的基本概念 假设一个文件是由假设一个文件是由n n个记录个记录R R1 1,R R2
2、 2,R Rn n组成,所组成,所谓排序就是以记录中某个谓排序就是以记录中某个(或几个或几个)字段值不减字段值不减(或不增或不增)的的次序将这次序将这n n个记录重新排列,称该字段为排序码。能唯一标个记录重新排列,称该字段为排序码。能唯一标识一个记录的字段称为关键码,关键码可以作为排序码,但识一个记录的字段称为关键码,关键码可以作为排序码,但排序码不一定要是关键码。排序码不一定要是关键码。第1页/共50页第二页,共50页。按排序过程中使用到的存储介质来分,可以按排序过程中使用到的存储介质来分,可以(ky)(ky)将排序将排序分成两大类分成两大类:内排序和外排序。内排序和外排序。内排序是指在排序
3、过程中所有数据内排序是指在排序过程中所有数据(shj)(shj)均放在内存中均放在内存中处理,不需要使用外存的排序方法。而对于数据处理,不需要使用外存的排序方法。而对于数据(shj)(shj)量很量很大的文件,在内存不足的情况下,则还需要使用外存,这种大的文件,在内存不足的情况下,则还需要使用外存,这种排序方法称为外排序。排序方法称为外排序。排序码相同排序码相同(xin tn)(xin tn)的记录,若经过排序后,这些的记录,若经过排序后,这些记录仍保持原来的相对次序不变,称这个排序算法是稳定的。记录仍保持原来的相对次序不变,称这个排序算法是稳定的。否则,称为不稳定的排序算法。否则,称为不稳定
4、的排序算法。第2页/共50页第三页,共50页。评价评价(pngji)(pngji)排序算法优劣的标准排序算法优劣的标准 :首先考虑算法执行所需的时间,这主要是用执行过程中的首先考虑算法执行所需的时间,这主要是用执行过程中的比较次数和移动比较次数和移动(ydng)(ydng)次数来度量;次数来度量;其次考虑算法执行所需要的附加空间。其次考虑算法执行所需要的附加空间。当然,保证算法的正确性是不言而喻的,可读性等也是要当然,保证算法的正确性是不言而喻的,可读性等也是要考虑的因素。考虑的因素。第3页/共50页第四页,共50页。排序排序(pi x)(pi x)算法如未作特别的说明,使用的有关定义算法如未
5、作特别的说明,使用的有关定义如下如下 :/*/*常见排序算法常见排序算法(sun f)(sun f)的头文件,文件名的头文件,文件名table.h*/table.h*/#define MAXSIZE 100 /*#define MAXSIZE 100 /*文件中记录个数的最大值文件中记录个数的最大值*/*/typedef int keytype;/*typedef int keytype;/*定义排序码类型为整数类型定义排序码类型为整数类型*/*/typedef struct typedef struct keytype key;keytype key;/*/*此处还可以定义记录中除排序码外的
6、其它域此处还可以定义记录中除排序码外的其它域*/*/recordtype;/*recordtype;/*记录类型的定义记录类型的定义*/*/typedef struct typedef struct recordtype rMAXSIZE+1;recordtype rMAXSIZE+1;int length;/*int length;/*待排序文件中记录的个数待排序文件中记录的个数*/*/table;/*table;/*待排序文件类型待排序文件类型*/*/为了方便为了方便(fngbin),r0一般不用于存放排序码,在一一般不用于存放排序码,在一些排序算法中它可以用来作为些排序算法中它可以用来作
7、为中间单元存放临时数据。中间单元存放临时数据。length域是待排序的记录个数,域是待排序的记录个数,它必须不大于它必须不大于MAXSIZE,这样,这样,第第1length个记录的排序码分个记录的排序码分别存于别存于r1.keyrlength.key中中 第4页/共50页第五页,共50页。10.2 插入排序 插入排序的基本插入排序的基本(jbn)(jbn)方法是方法是:将待排序文件中的记录将待排序文件中的记录(jl)(jl),逐个地按其排序码值的大小逐个地按其排序码值的大小插入到目前已经排好序的若干个记录插入到目前已经排好序的若干个记录(jl)(jl)组成的文件中的适当组成的文件中的适当位置,
8、并保持新文件有序。位置,并保持新文件有序。10.2.1 10.2.1 直接直接直接直接(zhji)(zhji)插入排序插入排序插入排序插入排序 直接插入排序算法的思路是直接插入排序算法的思路是:初始可认为文件中的第初始可认为文件中的第1 1个记录己排好序,然后将第个记录己排好序,然后将第2 2个到第个到第n n个记录依次插入已排个记录依次插入已排序的记录组成的文件中。在对第序的记录组成的文件中。在对第i i个记录个记录R Ri i进行插入时,进行插入时,R R1 1,R R2 2,R Ri-1i-1已排序,将记录已排序,将记录R Ri i的排序码的排序码keykeyi i与已经与已经排好序的排
9、序码从右向左依次比较,找到排好序的排序码从右向左依次比较,找到R Ri i应插入的位应插入的位置,将该位置以后直到置,将该位置以后直到R Ri-1i-1各记录顺序后移,空出该位置各记录顺序后移,空出该位置让让R Ri i插入。插入。第5页/共50页第六页,共50页。一组记录的排序一组记录的排序(pi x)(pi x)码分别为码分别为:312312,126126,272272,226226,2828,165165,123 123 初初始始时时将将第第1 1个个排排序序码码作作为为已已经经排排好好序序的的,把把排排好好序序的的数数据据记记录录放放入入中中括括号号 中中,表表示示有有序序的的文文件件
10、(wnjin)(wnjin),剩剩下的在中括号外,如下所示:下的在中括号外,如下所示:312312,126126,272272,226226,2828,165165,123 123 设设前前3 3个个记记录录的的排排序序码码已已重重新新排排列列有有序序,构构成成一一个个含含有有(hn yu)3(hn yu)3个记录的有序文件个记录的有序文件:126126,272272,312312,226226,2828,165165,123 123 现在要将第现在要将第4 4个排序码个排序码226226插入插入 !第6页/共50页第七页,共50页。126126,272272,312312,226226,28
11、28,165165,123123现在现在(xinzi)(xinzi)要将第要将第4 4个排序码个排序码226226插入插入 !将待插入的排序将待插入的排序(pi x)(pi x)码码226226和已经有序的最后一个和已经有序的最后一个排序排序(pi x)(pi x)码码312312比较,因为待插入的排序比较,因为待插入的排序(pi x)(pi x)码码226226小于小于312312,所以,所以226226肯定要置于肯定要置于312312的前面,至于是否就是的前面,至于是否就是置于置于312312的前一个位置,此时还不能确定,需要继续向左的前一个位置,此时还不能确定,需要继续向左比较;比较;将
12、所有大于待插入排序将所有大于待插入排序(pi x)(pi x)码码226226的那两个的那两个排序排序(pi x)(pi x)码码312312和和272272依次后移一个位置,在空出依次后移一个位置,在空出的位置插入待排序的位置插入待排序(pi x)(pi x)的排序的排序(pi x)(pi x)码码226226,得,得一含有一含有4 4个记录的有序文件:个记录的有序文件:126126,226226,272272,312312,2828,165165,123 123 第7页/共50页第八页,共50页。需要注意的是,当待插入排序需要注意的是,当待插入排序(pi x)(pi x)码小于所有已排序码
13、小于所有已排序(pi x)(pi x)的排序的排序(pi x)(pi x)码时,如在插入第码时,如在插入第5 5个值个值2828时:时:126126,226226,272272,312312,2828,165165,123123算法设计的时候如处理?算法设计的时候如处理?方法之一:设置方法之一:设置(shzh)“(shzh)“哨兵哨兵”第8页/共50页第九页,共50页。void insertsort(table*tab)void insertsort(table*tab)int i,j;int i,j;for(i=2;ilength;i+)/*for(i=2;ilength;i+)/*依次插入
14、从第依次插入从第2 2个开始个开始(kish)(kish)的所有元素的所有元素*/*/j=i-1;j=i-1;tab-r0.key=tab-ri.key;/*tab-r0.key=tab-ri.key;/*设置哨兵,准备找插入位置设置哨兵,准备找插入位置*/*/while(tab-r0.keyrj.key)/*while(tab-r0.keyrj.key)/*找插入位置并后移找插入位置并后移*/*/tab-rj+1.key=tab-rj.key;/*tab-rj+1.key=tab-rj.key;/*后移后移*/*/j=j-1;/*j=j-1;/*继续向前(左)查找继续向前(左)查找*/*/t
15、ab-rj+1.key=tab-r0.key;/*tab-rj+1.key=tab-r0.key;/*插入第插入第i i个元素的副本,即前面设置的哨兵个元素的副本,即前面设置的哨兵*/*/算法算法10.1 10.1 直接插入排序算法直接插入排序算法 第9页/共50页第十页,共50页。设待排序的设待排序的 7 7记录的排序码为记录的排序码为 312312,126126,272272,226226,2828,165165,123123,直接插入排序算法,直接插入排序算法(sun f)(sun f)的执行过程如图的执行过程如图 10.210.2所示。所示。哨兵哨兵 排序码排序码 312 312,12
16、6126,272272,226226,2828,165165,123123初始初始 ()()312 312,126126,272272,226226,2828,165165,123123i=2i=2:(126126)126 126,312312,272272,226226,2828,165165,123123i=3i=3:(272272)126 126,272272,312312,226226,2828,165165,123123i=4i=4:(226226)126 126,226226,272272,312312,2828,165165,123123i=5i=5:(2828)28 28,12
17、6126,226226,272272,312312,165165,123123i=6i=6:(165165)28 28,126126,165165,226226,272272,312312,123123i=7i=7:(123123)28 28,123123,126126,165165,226226,272272,312312图图10.2 10.2 直接插入排序算法直接插入排序算法(sun f)(sun f)执行过程示意图执行过程示意图 第10页/共50页第十一页,共50页。直接插入排序算法执行时间直接插入排序算法执行时间(shjin)(shjin)的分析:的分析:最好最好(zu ho)(zu
18、ho)的情况的情况 :即初始排序码开始就是有序的情况下,因为当插即初始排序码开始就是有序的情况下,因为当插入第入第i i个排序码时,该算法内循环个排序码时,该算法内循环whilewhile只进行一次条件只进行一次条件(tiojin)(tiojin)判断而不执行循环体,外循环共执行判断而不执行循环体,外循环共执行n-1n-1次,次,其循环体内不含内循环每次循环要进行其循环体内不含内循环每次循环要进行2 2次移动操作,次移动操作,所以在最好情况下,直接插入排序算法的比较次数为所以在最好情况下,直接插入排序算法的比较次数为(n-1)(n-1)次,移动次数为次,移动次数为2*(n-1)2*(n-1)次
19、。次。第11页/共50页第十二页,共50页。最坏情况最坏情况(qngkung)(qngkung):即初始排序码开始是逆序的情况下,因为当插即初始排序码开始是逆序的情况下,因为当插入第入第i i个排序码时,该算法内循环个排序码时,该算法内循环whilewhile要执行要执行i i次条件次条件判断,循环体要执行判断,循环体要执行i-li-l次,每次要移动次,每次要移动1 1个记录,外个记录,外循环共执行循环共执行n-1n-1次,其循环体内不含内循环每次循环次,其循环体内不含内循环每次循环要进行要进行2 2次移动操作,所以在最坏情况下,比较次数次移动操作,所以在最坏情况下,比较次数为为(1+2+n)
20、*(n-1)(1+2+n)*(n-1),移动次数为,移动次数为(1+2+2+2+n+2)*(n-1)(1+2+2+2+n+2)*(n-1)。假设待排序文件中的记录。假设待排序文件中的记录以各种以各种(zhn)(zhn)排列出现的概率相同,因为当插入排列出现的概率相同,因为当插入第第i i个排序码时,该算法内循环个排序码时,该算法内循环whilewhile平均约要执行平均约要执行i/2i/2次条件判断,循环体要执行(次条件判断,循环体要执行(i-li-l)/2/2次,外循环共执次,外循环共执行行n-1n-1次,所以平均比较次数约为次,所以平均比较次数约为(2+3+n)/2*(n-1)(2+3+n
21、)/2*(n-1),平均移动次数为,平均移动次数为(n-1)*(2+1+3+1+n+1)/2(n-1)*(2+1+3+1+n+1)/2,也即,也即直接插入排序算法的时间复杂度为直接插入排序算法的时间复杂度为O(n2)O(n2)。第12页/共50页第十三页,共50页。10.2.2 10.2.2 二分法插入排序二分法插入排序 二分法插入排序的思想:二分法插入排序的思想:根据插入排序的基本思想,在找第根据插入排序的基本思想,在找第i i个记录的插入位个记录的插入位置时,前置时,前i-li-l个记录已排序,将第个记录已排序,将第i i个记录的排序码个记录的排序码keyikeyi和和已排序的前已排序的前
22、i-1i-1个的中间位置记录的排序码进行比较个的中间位置记录的排序码进行比较(bjio)(bjio),如果,如果keyikeyi小于中间位置记录排序码,则可以小于中间位置记录排序码,则可以在前半部继续使用二分法查找,否则在后半部继续使用在前半部继续使用二分法查找,否则在后半部继续使用二分法查找,直到查找范围为空,即可确定二分法查找,直到查找范围为空,即可确定keyikeyi的插入的插入位置。位置。第13页/共50页第十四页,共50页。void binarysort(table*tab)void binarysort(table*tab)int i,j,left,right,mid;int i,
23、j,left,right,mid;for(i=2;ilength;i+)/*for(i=2;ilength;i+)/*依次插入从第依次插入从第2 2个开始的所有元素个开始的所有元素*/*/tab-r0.key=tab-ri.key;/*tab-r0.key=tab-ri.key;/*保存保存(bocn)(bocn)待插入的元素待插入的元素*/*/left=1;right=i-1;/*left=1;right=i-1;/*设置查找范围的左、右位置值设置查找范围的左、右位置值*/*/while(left=right)/*while(leftri.keyrmid.key)right=mid-1;if
24、(tab-ri.keyrmid.key)right=mid-1;else left=mid+1;else left=mid+1;/*/*插入位置为插入位置为left*/left*/for(j=i-1;j=left;j-)tab-rj+1.key=tab-rj.key;/*for(j=i-1;j=left;j-)tab-rj+1.key=tab-rj.key;/*后移后移,空出插入位置空出插入位置*/*/tab-rleft.key=tab-r0.key;/*tab-rleft.key=tab-r0.key;/*插入第插入第i i个元素的副本个元素的副本*/*/*/*算法算法10.2 10.2 二
25、分法插入排序算法二分法插入排序算法*/*/第14页/共50页第十五页,共50页。设待排序的设待排序的7 7记录的排序码为记录的排序码为312312,126126,272272,226226,2828,165165,123123,在前,在前6 6个记录已经排序的情况下,使用二个记录已经排序的情况下,使用二分法插入排序算法分法插入排序算法(sun f)(sun f)插入第插入第7 7个记录的排序码个记录的排序码123123的的执行过程示意如图执行过程示意如图10.310.3所示(见书本)。所示(见书本)。二分法插入排序算法二分法插入排序算法(sun f)(sun f),在查找第,在查找第i i个记
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 李云清杨庆红揭 安全 学习 教案
限制150内