常见排序算法小结_第1页
常见排序算法小结_第2页
常见排序算法小结_第3页
常见排序算法小结_第4页
常见排序算法小结_第5页
已阅读5页,还剩8页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、常见排序算法小结     排序算法经过了很长时间的演变,产生了很多种不同的方法。对于初学者来说,对它们进行整理便于理解记忆显得很重要。每种算法都有它特定的使用场合,很难通用。因此,我们很有必要对所有常见的排序算法进行归纳。     我不喜欢死记硬背,我更偏向于弄清来龙去脉,理解性地记忆。比如下面这张图,我们将围绕这张图来思考几个问题。     上面的这张图来自一个PPT。它概括了数据结构中的所有常见的排序算法。现在有以下几个问题:    

2、; 1、每个算法的思想是什么?      2、每个算法的稳定性怎样?时间复杂度是多少?      3、在什么情况下,算法出现最好情况 or 最坏情况?      4、每种算法的具体实现又是怎样的?     这个是排序算法里面最基本,也是最常考的问题。下面是我的小结。一、直接插入排序(插入排序)。     1、算法的伪代码(这样便于理解):  

3、60;      INSERTION-SORT (A, n)             A1 . . n      for j 2 to n           do key A j        &#

4、160;  i j 1           while i > 0 and Ai > key                do Ai+1 Ai               &#

5、160;     i i 1           Ai+1 = key     2、思想:如下图所示,每次选择一个元素K插入到之前已排好序的部分A1i中,插入过程中K依次由后向前与A1i中的元素进行比较。若发现发现Ax>=K,则将K插入到Ax的后面,插入前需要移动元素。     3、算法时间复杂度。      &

6、#160;   最好的情况下:正序有序(从小到大),这样只需要比较n次,不需要移动。因此时间复杂度为O(n)          最坏的情况下:逆序有序,这样每一个元素就需要比较n次,共有n个元素,因此实际复杂度为O(n2)          平均情况下:O(n2)     4、稳定性。      

7、理解性记忆比死记硬背要好。因此,我们来分析下。稳定性,就是有两个相同的元素,排序先后的相对位置是否变化,主要用在排序时有多个排序规则的情况下。在插入排序中,K1是已排序部分中的元素,当K2和K1比较时,直接插到K1的后面(没有必要插到K1的前面,这样做还需要移动!),因此,插入排序是稳定的。     5、代码(c版)           二、希尔排序(插入排序)     1、思想:希尔排序也是一种插入排序方

8、法,实际上是一种分组插入方法。先取定一个小于n的整数d1作为第一个增量,把表的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序;然后,取第二个增量d2(d1),重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<<d2<d1),即所有记录放在同一组中进行直接插入排序为止。         例如:将 n 个记录分成 d 个子序列:        R0,  

9、 Rd,     R2d,     Rkd         R1,   R1+d, R1+2d,R1+kd                   Rd-1,R2d-1,R3d-1,R(k+1)d-1       

10、     说明:d=5 时,先从Ad开始向前插入,判断Ad-d,然后Ad+1与A(d+1)-d比较,如此类推,这一回合后将原序列分为d个组。<由后向前>     2、时间复杂度。       最好情况:由于希尔排序的好坏和步长d的选择有很多关系,因此,目前还没有得出最好的步长如何选择(现在有些比较好的选择了,但不确定是否是最好的)。所以,不知道最好的情况下的算法时间复杂度。     &

11、#160; 最坏情况下:O(N*logN),最坏的情况下和平均情况下差不多。       平均情况下:O(N*logN)     3、稳定性。       由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。(有个猜测,方便记忆:一般来说,若存在不相邻元素间交换,则很可能是不稳

12、定的排序。)     4、代码(c版)            三、冒泡排序(交换排序)       1、基本思想:通过无序区中相邻记录关键字间的比较和位置的交换,使关键字最小的记录如气泡一般逐渐往上“漂浮”直至“水面”。              2、时间复杂

13、度       最好情况下:正序有序,则只需要比较n次。故,为O(n)        最坏情况下:  逆序有序,则需要比较(n-1)+(n-2)+1,故,为O(N*N)      3、稳定性        排序过程中只交换相邻两个元素的位置。因此,当两个数相等时,是没必要交换两个数的位置的。所以,它们的相对位置并没有改

14、变,冒泡排序算法是稳定的!      4、代码(c版)           四、快速排序(交换排序)     1、思想:它是由冒泡排序改进而来的。在待排序的n个记录中任取一个记录(通常取第一个记录),把该记录放入适当位置后,数据序列被此记录划分成两部分。所有关键字比该记录关键字小的记录放置在前一部分,所有比它大的记录放置在后一部分,并把该记录排在这两部分的中间(称为该记录归位),这个过程称作一趟快速排序。&

15、#160;          说明:最核心的思想是将小的部分放在左边,大的部分放到右边,实现分割。              2、算法复杂度        最好的情况下:因为每次都将序列分为两个部分(一般二分都复杂度都和logN相关),故为 O(N*logN)   &#

16、160;    最坏的情况下:基本有序时,退化为冒泡排序,几乎要比较N*N次,故为O(N*N)      3、稳定性        由于每次都需要和中轴元素交换,因此原来的顺序就可能被打乱。如序列为 5 3 3 4 3 8 9 10 11会将3的顺序打乱。所以说,快速排序是不稳定的!      4、代码(c版)     

17、;       五、直接选择排序(选择排序)      1、思想:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。具体做法是:选择最小的元素与未排序部分的首部交换,使得序列的前面为有序。        2、时间复杂度。       

18、;最好情况下:交换0次,但是每次都要找到最小的元素,因此大约必须遍历N*N次,因此为O(N*N)。减少了交换次数!       最坏情况下,平均情况下:O(N*N)      3、稳定性       由于每次都是选取未排序序列A中的最小元素x与A中的第一个元素交换,因此跨距离了,很可能破坏了元素间的相对位置,因此选择排序是不稳定的!      4、代码(c版)

19、0;         六、堆排序     1、思想:利用完全二叉树中双亲节点和孩子节点之间的内在关系,在当前无序区中选择关键字最大(或者最小)的记录。也就是说,以最小堆为例,根节点为最小元素,较大的节点偏向于分布在堆底附近。       2、算法复杂度          最坏情况下,接近于最差情况下:O(N*logN)

20、,因此它是一种效果不错的排序算法。      3、稳定性          堆排序需要不断地调整堆,因此它是一种不稳定的排序!      4、代码(c版,看代码后更容易理解!)                七、归并排序  

21、60;   1、思想:多次将两个或两个以上的有序表合并成一个新的有序表。        2、算法时间复杂度           最好的情况下:一趟归并需要n次,总共需要logN次,因此为O(N*logN)           最坏的情况下,接近于平均情况下,为O(N*logN) 

22、          说明:对长度为n的文件,需进行logN 趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。      3、稳定性          归并排序最大的特色就是它是一种稳定的排序算法。归并过程中是不会改变元素的相对位置的。       4、缺点是,它需要O(n)的额外空间。但是很适合于多链表排序。   

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论