在n比较小时,快速排序最佳
在n比较大时,堆排序和归并排序时间省,但是,归并排序所需的辅助空间较多
直接插入排序最简单,在n较小且序列基本有序的情况下最佳
基数排序是个n很大,并为关键字较小的序列
稳定:直接插入排序、冒泡排序、归并排序、基数排序
最好时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 稳定性 | 复杂性 | 辅助空间 | 要点 | ||
冒泡排序 | O(n) | O(n^2) | O(n^2) | 稳定 | 简单 | O(1) | 相邻的两个比较,若逆序,交换,第i趟将第i大的元素交换到序列倒数第i个位置 | 附设标志位,某一趟没有元素交换,表明已经有序,直接结束 |
快速排序 | O(n logn) | O(n logn) | O(n^2) | 不稳定 | 复杂 | O(logn)~O(n) |
以序列的第一个元素为基准,将待排序列分成两部分,然后分别对这两部分进行快速排序 low high两个指针,一开始指向序列开头和结尾,从high开始,找到第一个小于基准的数,和low交换,从low开始,找到第一个大于基准的数,和high交换,直到low==high |
递归 可以不交换,直接覆盖 |
直接插入排序 | O(n) | O(n^2) | O(n^2) | 稳定 | 简单 | O(1) |
将第一个元素看成有序的,从第二个元素开始,将其插入已排序序列的合适位置 |
移动元素 |
希尔排序 | O(n) | O(n^1.5) | O(n^2) | 不稳定 | 复杂 | O(1) |
缩小增量排序(最后一个增量为1,即为直接插入排序) 待元素基本有序的时候,对整体进行一次直接插入排序 |
增量序列中的值不要有除1之外的公因子 |
简单选择排序 | O(n^2) | O(n^2) | O(n^2) | 不稳定 | 简单 | O(1) |
第i趟,从n-i+1个元素中选出一个第i小的元素,记录该元素的小标,将该元素和数组下标为i-1的元素交换 先假设子序列第一个是最小的 |
|
堆排序 | O(n logn) | O(n logn) | O(n logn) | 不稳定 | 复杂 | O(1) |
完全二叉树 先建堆,从数组下标为n/2向下取整-1的元素依次向前进行调整 输出堆顶元素,用最后一个元素代替堆顶元素,再调整堆 |
|
归并排序 | O(n logn) | O(n logn) | O(n logn) | 稳定 | 复杂 | O(n) |
先待排序列分成一个一个元素,然后逐一合并 和待排序列一样大小的辅助空间 |
参考两个顺序表的合并 分治策略 |
基数排序 | O(d(r+n)) | O(d(r+n) | O(d(r+n) | 稳定 | 复杂 | O(rd+n) |
从最次关键字开始排序,直到最主关键字 和待排序列一样大小的辅助空间 |