《数据结构》排序》PPT课件复习过程.ppt
《《数据结构》排序》PPT课件复习过程.ppt》由会员分享,可在线阅读,更多相关《《数据结构》排序》PPT课件复习过程.ppt(30页珍藏版)》请在三一办公上搜索。
1、第9章 排序,9.1插入排序 9.2交换排序 9.3选择排序 9.4归并排序 习题,排序是针对记录的集合R1,R2,Rn,其相应的关键字序列为K1,K2,Kn,重组记录之间的关系,使记录的排列次序满足相应的关键字的递增或递减关系。记录的集合也称为待排序序列。若待排序序列完全存放在内存中,则该排序称为内部排序;若由于数据集合太大,在排序过程中,需对外存进行访问,则该排序称为外部排序。有如下一组待排序序列(每个记录只列出关键字一项): 53,25,67(1),46,29,67(2),89,43,67(3),76 括号里的数字代表等值记录的位置,若排序后为: 25,29,43,46,53,67(1)
2、,67(2),67(3),76,89 则称所用的排序方法是稳定的,反之,若三个等值记录的排列顺序不是上述顺序,就称所用排序的方法是不稳定的。,9.1 插入排序,9.1.1 直接插入排序 它的基本操作是在处理第i个记录时,前面1到i-1记录已排成有序,将第i个记录插入有序表中,得到一个新的有序表,表的长度加1。当表中只有一个记录时,该表已是有序表,所以,可以从第二个记录开始,逐个插入记录,直至处理完待排序序列的所有记录。 直接插入排序的时间复杂度为O(n2),并且是一种稳定排序。当n较小时,排序的效率较高,是一种常用的排序方法,例如,有一组关键字序列为91,67,35,62,29,72,46,直
3、接插入排序过程如图9.1所示。,用C语言描述的直接插入排序算法如下: typedef struct int key; /* 其他域 */ NODE; 算法9.1 直接插入排序算法。 void InsertSort (NODE array,int n) /* 对存放在数组array中,长度为n的序列排序 */ int i,j; NODE x; for(i=1;i=0 ,9.1.2 希尔排序 希尔排序是一种步长递减的插入排序,又称为“缩小增量排序”。该排序方法是,将直接插入分成插入步长由大到小不同的若干趟来进行。初始,步长较大,相当于把待排记录序列分成若干子序列,各子序列中记录的间隔为步长距离,由
4、于子序列的长度小,所以子序列的插入排序的效率较高。以后各趟逐步减小步长,随着步长的减小,子序列的长度在增加,但子序列中包含了上一趟经过大的步长插入排序的结点,因此,已有部分结点有序,这样,在排序中记录移动的次数就少,排序的效率也就高。最后一趟是步长为1,即:对整个序列直接插入排序,但这时整个序列已基本有序,只要做少量记录移动,就可将该序列排成有序。,图9.2 希尔排序示例,例如,有8个关键字序列为91,67,35,62,29,72,46,57,插入排序的步长序列为4,2,1。希尔插入排序过程如图9.2。,步长序列的选择没有严格的规定,只要该序列d1,d2,dt满足d1d2dt,并且当t1时,d
5、1=1,该序列都可选作步长序列。一般采用步长序列为d1=n/2,di+1=di/2(n为待排序序列的长度)。,用C语言描述的希尔排序算法如下:算法9.2 希尔排序算法。 void ShellSort(NODE array,int n) /* 对存放在数组array中,长度为n的序列希尔排序 */ int i,j,step; NODE x; for(step=n/2; step0; step=step/2) /* step不断变小,直至为1 */ for(i=step; i=0 ,希尔排序的分析是一个复杂的问题,但它的排序速度要比直接插入排序快,另外,它是一种不稳定排序,9.2 交换排序,交换排
6、序基本思想:比较二个待排序记录的关键字,若为逆序,则交换位置,反之,保持原序。,9.2.1 冒泡(简单交换排序) 冒泡排序的方法是:首先比较arrayn-1.key和arrayn-2. key,若为逆序则交换之,然后比较arrayn-2.key和arrayn-3.key,依此类推,直到比较array1.key和array0.key,称为一趟“冒泡”,其结果是将具有最小关键字的记录排到序列的第1个位置上。然后再arrayn-1到array1之间进行一趟“冒泡”,将具有次小关键字的记录排到序列的第2个位置上。依此类推,直到第n-1趟,在arrayn-1和arrayn-2之间进行“冒泡”后,待排序序
7、列已排成有序。,例如,有一组关键字序列为91,67,35,62,29,72,46,冒泡排序过程如图9.3所示。,用C语言描述的简单交换排序算法如下:算法9.3 冒泡排序算法。 void BubbleSort (NODE array,int n) /* 对存放在数组array中,长度为n的序列冒泡排序 */ int i,j,flag; NODE temp; for(i=0;ii;j-) /* 从后向前比较,小数向前交换,最小值到前位 */ if(arrayj.keyarrayj-1.key) temp=arrayj; arrayj=arrayj-1; arrayj-1=temp; flag=1;
8、 /* 有逆序存在,flag为1 */ if(flag=0) break; /* 若一趟“冒泡”中没有逆序,则序列已有序 */ ,冒泡排序的时间复杂度为O(n2),并且是一种稳定排序。,9.2.2 快速排序 冒泡排序的一种改进。基本思想是:通过一趟排序后,大幅度减小排序序列的长度。在一趟排序后将某个记录根据其关键字,排到序列的中间位置,且左边所有记录的关键字都比它的关键字小,而右边所有记录的关键字都比它的关键字大,这样一趟排序后,不仅有一个记录已排到正确的位置上,如下标为i,而且待排序序列分裂成长度较小的两个待排序区间(array0到arrayi-1和arrayi+1到arrayn-1),将上
9、述过程称为“划分”。一次划分得到两个小序列,再递归地对这两个小序列进行划分,直到序列的长度为1,这时待排序序列已排成有序。显然,一次划分的时间复杂度是O(n),下面讨论划分的算法。,对arraystart到arrayend序列进行划分,首先要确定一个划分标准,通常选取序列的第一个记录的关键字,用变量mid暂存,另附设两个指针i和j,其初值分别为start和end,划分的具体做法如下(i=start,j=end ): (1)j从所指的位置开始从后向前扫描,直到 arrayj.keymid.key时,arrayj和arrayi交换,i增1。 (2)i从所指的位置开始从前向后扫描,直到 arrayj
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 排序 PPT 课件 复习 过程
链接地址:https://www.31ppt.com/p-1986626.html