排序汇总

稳定性

如果完成排序后,原本有序的元素不会改变其相对的位置,表示该排序是稳定的;如果完成排序后,原本有序的元素会改变其相对的位置,表示该排序是不稳定的

举个简单的例子,如果对[1, 2, 2, 3, 4]进行排序,如下图所示:

1

冒泡排序

时间复杂度:O(n2);空间复杂度:O(1);稳定

注意:如果数组已经有序,那么在第一轮遍历时就会退出循环,所以最好时间复杂度为 O(n)

选择排序

时间复杂度:O(n2);空间复杂度:O(1);不稳定

关于不稳定,举个例子[7, 7, 2],那么第一轮交换后为[2, 7, 7],两个 7 的相对位置发生了变化

注意:该排序的时间复杂度与数组的特点无关,均为 O(n2)

插入排序

时间复杂度:O(n2);空间复杂度:O(1);稳定

注意:如果数组已经有序,那么内层循环会第一时间退出,所以最好时间复杂度为 O(n)

归并排序

详情可见 详解归并排序及其应用

时间复杂度:O(nlogn);空间复杂度:O(n);稳定

快速排序

详情可见 详解快排及其应用

时间复杂度:O(nlogn);空间复杂度:O(logn) -> 递归栈所需空间;不稳定

注意:如果数组已经有序,那么时间复杂度为 O(n2)

堆排序

详情可见 详解堆排序「优先队列」

时间复杂度:O(nlogn);空间复杂度:O(1);不稳定

总结

排序算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性
冒泡排序O(n2)O(n)O(n2)O(1)稳定
选择排序O(n2)O(n2)O(n2)O(1)不稳定
插入排序O(n2)O(n)O(n2)O(1)稳定
归并排序O(nlogn)O(nlogn)O(nlogn)O(n)稳定
快速排序O(nlogn)O(nlogn)O(n2)O(logn) -> 递归栈不稳定
堆排序O(nlogn)O(nlogn)O(nlogn)O(1)不稳定