排序方法 | 最好时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度(辅助存储) | 稳定性 | 适用情况 |
---|---|---|---|---|---|---|
插入排序 | O(N) | O(N^2) | O(N^2) | O(1) | 稳定√ | 数据量小,部分或整体有序 |
希尔排序 | O(N) | O(N^1.3) | O(N^2) | O(1) | 不稳定 | |
选择排序 | O(N^2) | O(N^2) | O(N^2) | O(1) | 不稳定 | 数据量小,对稳定性无要求 |
堆排序 | O(NlogN) | O(NlogN) | O(NlogN) | O(1) | 不稳定 | 数据量大,百万级 |
冒泡排序 | O(N) | O(N^2) | O(N^2) | O(1) | 稳定√ | 数据量小,对稳定性有要求 |
快速排序 | O(NlogN) | O(NlogN) | O(N^2) | O(logN)~O(N) | 不稳定 | 数据量大,但递归,有内存开销 |
归并排序 | O(NlogN) | O(NlogN) | O(NlogN) | O(N) | 稳定√ | 数据量大 |
面试:快排>归并>堆>冒泡>插入>选择
堆排序使用建议:由于初始化堆需要比较的次数较多,因此,堆排序比较适合于数据量非常大的场合(百万数据或更多)。且由于高效的快速排序是基于递归实现的,所以在数据量非常大时会发生堆栈溢出错误。
快排,归并排,堆排序时间复杂度相同,但它们三者区别是快速排序和堆排序是不稳定的,归并为稳定型。对于辅助空间堆排序要求最小,归并最多。对于最好情况复杂度相同,最坏的情况下快速排序要复杂些。对于数据的数量来说,选择归并或堆,如果还要求考虑辅助空间,就用堆排序,在涉及稳定性方面则考虑归并(虽然所需空间较多)。