排序方法 | 平均时间复杂度 | 原地排序 | 额外空间 | 稳定排序 |
---|
插入排序(insert sort) | O(n^2) | 是 | O(1) | 是 |
归并排序(merge sort) | O(nlogn) | 否 | (O(n) | 是 |
快速排序(quick sort) | O(nlogn) | 是 | O(logn) | 否 |
堆排序 (heap sort) | O(nlogn) | 是 | O(1) | 否 |
注意:
- 后三种排序都是O(nlogn)级别的算法,但总体而言,快速排序是更加快的排序算法。一般系统级别的排序都是使用快速排序的方法实现的。
- 原地排序是实不需要开辟额外的空间,之间在原数组上进行操作即可完成排序过程。如果某一系统对空间比较敏感,则归并排序可能不太适合。
- 对于插入排序和堆排序而言,因为可以通过在数组上交换元素直接完成排序,所以其额外的空间开辟是O(1)级别的,即常数级别的空间。不管需要排序的数据有多少个变量,只需新建几个临时的变量即可完成排序。归并排序需要将数组复制一个备份,因此需要O(n)级别的空间。快速排序需要递归logn次,每次递归都要开辟常数个空间,因此其额外空间为O(logn)。
- 排序算法的稳定性是指,对于相等的元素,在排序后,原来靠前的元素依然靠前。即排序后,相等元素的相对位置没有发生改变。所谓排序算法的稳定性,是和具体实现相关的(和元素交换条件中是否包含‘=’有很大的关系),如果算法实现得不好,很有可能将插入排序和归并排序实现为不稳定的排序。可以通过自定义比较函数使得排序算法不存在稳定性问题:比如:
function compare(stu1,stu2){
if(stu1.score != stu2.score){
return stu1.score > stu2.score;
}else{
return stu1.name > stu2.name
}