概述
各种排序方法的综合比较
结论:
排序方法 平均时间 最坏时间 辅助存储
简单排序 O(n2) O(n2) O(1)
快速排序 O(nlogn) O(n2) O(logn)
堆排序 O(nlogn) O(nlogn) O(1)
归并排序 O(nlogn) O(nlogn) O(n)
基数排序 O(d(n+rd)) O(d(n+rd)) O(rd)
另外:直接插入排序、冒泡排序为简单排序,希尔排序(不稳定)
一、时间性能
按平均的时间性能来分,有三类排序方法:
时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最
好;
时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为
最好,特别是对那些对关键字近似有序的记录序列尤为如此;
时间复杂度为O(n)的排序方法只有,基数排序。
当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂
度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应
该尽量避免的情况。
简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。
二、空间性能
指的是排序过程中所需的辅助空间大小。
1. 所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O
(1);
2. 快速排序为O(logn ),为栈所需的辅助空间;
3. 归并排序所需辅助空间最多,其空间复杂度为O(n );
4.链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。
三、排序方法的稳定性能
1. 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在
排序之前和经过排序之后,没有改变。
2. 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。
3. 对于不稳定的排序方法,只要能举出一个实例说明即可。
4. 快速排序和堆排序是不稳定的排序方法
-------------------------------------------------------------------------------------------------------------------------
二、插入排序
1、直接插入排序
基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。排序过程:
38 | 49 | 65 | 97 | 76 | 13 | 27 | 49 | ... |
|
38 | 49 | 65 | 76 | 97 | 13 | 27 | 49 | ... |
|
13 | 38 | 49 | 65 | 76 | 97 | 27 | 49 | ... |
|
13 | 27 | 38 | 49 | 65 | 76 | 97 | 49 | ... |
|
13 | 27 | 38 | 49 | 49 | 65 | 76 | 97 | ... |
|
2、折半插入排序
在直接插入排序中,为了找到插入位置,采用了顺序查找的方法。为了提高查找速度,可以采用折半查找,这种排序称折半插入排序。
3、2-路插入排序
为减少排序过程中移动记录的次数,在折半插入排序的基础上加以改进:
49 | 38 | 65 | 97 | 78 | 13 | 27 | 49 | ... |
|
i=1 | 49 |
|
|
|
|
|
|
|
| first |
|
|
|
|
|
|
|
i=2 | 49 |
|
|
|
|
|
| 38 |
| final |
|
|
|
|
|
| first |
i=3 | 49 | 65 |
|
|
|
|
| 38 |
|
| final |
|
|
|
|
| first |
i=4 | 49 | 65 | 97 |
|
|
|
| 38 |
|
|
| final |
|
|
|
| first |
i=5 | 49 | 65 | 76 | 97 |
|
|
| 38 |
|
|
|
| final |
|
|
| first |
i=6 | 49 | 65 | 76 | 97 |
|
| 13 | 38 |
|
|
|
| final |
|
| first |
|
i=7 | 49 | 65 | 76 | 97 |
| 13 | 27 | 38 |
|
|
|
| final |
| first |
|
|
i=8 | 49 | 49 | 65 | 76 | 97 | 13 | 27 | 38 |
|
|
|
|
| final | first |
|
|
三、快速排序
1、起泡排序
首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。直至第n-1个记录和第n个记录的关键字进行过比较为止。
然后进行第二趟起泡排序,对前n-1个记录进行同样操作。
...直到在某趟排序过程中没有进行过交换记录的操作为止。
49 | 38 | 38 | 38 | 38 | 13 | 13 |
38 | 49 | 49 | 49 | 13 | 27 | 27 |
65 | 65 | 65 | 13 | 27 | 38 | 38 |
97 | 76 | 13 | 27 | 49 | 49 |
|
76 | 13 | 27 | 49 | 49 |
|
|
13 | 27 | 49 | 65 |
|
|
|
27 | 49 | 78 |
|
|
|
|
49 | 97 |
|
|
|
|
|
初始 | 第一趟 | 第二趟 | 第三趟 | 第四趟 | 第五趟 | 第六趟 |
2、快速排序
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
初始关键字 | 49 | 38 | 65 | 97 | 76 | 13 | 27 | 49 |
| i |
|
|
|
|
| j | j |
1次交换之后 | 27 | 38 | 65 | 97 | 76 | 13 |
| 49 |
| i |
| i |
|
|
| j |
|
2次交换之后 | 27 | 38 |
| 97 | 76 | 13 | 65 | 49 |
|
|
| i |
|
| j | j |
|
3次交换之后 | 27 | 38 | 13 | 97 | 76 |
| 65 | 49 |
|
|
| i | i |
| j |
|
|
4次交换之后 | 27 | 38 | 13 |
| 76 | 97 | 65 | 49 |
|
|
|
| ij |
| j |
|
|
完成一趟排序 | 27 | 38 | 13 | 49 | 76 | 97 | 65 | 49 |
|
|
|
|
|
|
|
|
|
初始状态 | 49 | 38 | 65 | 97 | 76 | 13 | 27 | 49 |
一次划分 | 27 | 38 | 13 | 49 | 76 | 97 | 65 | 49 |
分别进行 | 13 | 27 | 38 |
|
|
|
|
|
| 结束 |
| 结束 |
| 49 | 65 | 76 | 97 |
|
|
|
|
| 49 | 65 |
| 结束 |
|
|
|
|
|
| 结束 |
|
|
有序序列 | 13 | 27 | 38 | 49 | 49 | 65 | 76 | 97 |
最后
以上就是光亮发箍为你收集整理的排序算法性能比较的全部内容,希望文章能够帮你解决排序算法性能比较所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复