常用的排序算法有很多,本文在总结不同排序算法之前先从不同的维度来回顾一下排序算法:
【时间复杂度】
也就是指排序所消耗的总时间。对于一个序列List(长度为N)几种不同的性能分别是:1. 最好的性能上O(N); 2. 平均的性能是O(N*log N);3. 最坏的性能是O(N^2)
其中关于对数的运算有如下法则:
1、a^(log(a)(b))=b;
2、log(a)(MN)=log(a)(M)+log(a)(N);
3、log(a)(M÷N)=log(a)(M)-log(a)(N);
4、log(a)(M^n)=nlog(a)(M);
5、log(a^n)(M)=1/nlog(a)(M);
【空间复杂度】
主要是指排序算法实现的时候所占用的内存大小(或进行磁盘写操作时所占用的存储空间)。有时候可以牺牲一些存储空间来换取更好的时间效率。
【排序的基本思想】
要实现排序功能,大概有几种思路可以实现:插入法、交换法、选择法、合并法。
【稳定性】
通常算法的稳定性是指:当一个无序序列中存在两个相等的记录P和Q(P在前Q在后)。如果一个算法是稳定的,那么得到排序结果仍然是P在前Q在后,而不稳定的排序算法则可能是P在后Q在前的情况。
无序序列( P:(3,1) Q:(3,7) ) | (4,1) | (3,1) | (3,7) | (5,6) |
稳定排序(P,Q顺序未发生变化) | (3,1) | (3,7) | (4,1) | (5,6) |
不稳定排序(P,Q顺序发生了变化) | (3,7) | (3,1) | (4,1) | (5,6) |
稳定排序算法(n是序列的元素个数,k是不同键值的数量)
排序算法 | 最大时间复杂度 |
冒泡排序(bubble sort)(亦称:简单排序) | O(n^2) |
鸡尾酒排序(Cocktail sort,双向的冒泡排序) | O(n^2) |
插入排序(insertion sort) (亦称:简单排序) | O(n^2) |
Gnome 排序 | O(n^2) |
原地合并排序 | O(n^2) |
桶排序(bucket sort) | O(n); 需要 O(k) 额外空间 |
计数排序(counting sort) | O(n+k); 需要 O(n+k) 额外空间 |
合并排序(merge sort) | O(nlog n); 需要 O(n) 额外空间 |
二叉排序树排序 (Binary tree sort) | O(nlog n)期望时间; O(n^2)最坏时间; 需要 O(n) 额外空间 |
鸽巢排序(Pigeonhole sort) | O(n+k); 需要 O(k) 额外空间 |
基数排序(radix sort) | O(n·k); 需要 O(n) 额外空间 |
图书馆排序 | O(nlog n) with high probability,需要 (1+ε)n额外空间 |
不稳定排序算法(n是序列的元素个数,k是不同键值的数量)
排序算法 | 最大时间复杂度 |
选择排序(selection sort) | O(n^2) |
希尔排序(shell sort) | O(nlog n) |
组合排序 | O(nlog n) |
堆排序(heapsort) | O(nlog n) |
平滑排序 | O(nlog n) |
Introsort | O(nlog n) |
快速排序(quicksort) | O(nlog n) 期望时间,O(n^2) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序 |
Patience sorting | O(nlog n+ k) 最坏情况时间,需要 额外的 O(n+ k) 空间,也需要找到最长的递增子串行(longest increasing subsequence) |
主要常用算法综合比较:
排序方式 | 时间复杂度 | 空间复杂度 | 稳定性 | 复杂性 | ||
平均 | 最坏 | 最好 | ||||
插入排序 | O(N^2) | O(N^2) | O(N) | O(1) | 稳定 | 简单 |
希尔排序 | O(N^1.3) | O(1) | 不稳定 | 较复杂 | ||
冒泡排序 | O(N^2) | O(N^2) | O(N) | O(1) | 稳定 | 简单 |
快速排序 | O(Nlog2(N)) | O(N^2) | O(Nlog2(N)) | O(log2(N)) | 不稳定 | 较复杂 |
选择排序 | O(N^2) | O(N^2) | O(N^2) | O(1) | 不稳定 | 简单 |
堆排序 | O(Nlog2(N)) | O(Nlog2(N)) | O(Nlog2(N)) | O(1) | 不稳定 | 较复杂 |
归并排序 | O(Nlog2(N)) | O(Nlog2(N)) | O(Nlog2(N)) | O(N) | 稳定 | 较复杂 |
基数排序 | O(D(N+R)) | O(D(N+R)) | O(D(N+R)) | O(R) | 稳定 | 较复杂 |
人生需要记录