假设排序均从小到大排序
排序算法 | 工作原理 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 是否稳定排序 |
冒泡排序 | 把相邻元素两两比较,若左侧的元素大于右侧的元素,则交换,否则不交换。(每一轮最大的会跑到最右边) | O() | O() | O(1) | 稳定 |
快速排序 | 使用分治法的思想,每一轮选择一个基准元素,让大于它的元素移动到数列的一边,从而把数列分成两部分。 | O(nlogn) | O() | O(1) | 不稳定 |
选择排序 | 每一轮选择最小的元素直接交换到最左侧。 | O() | O() | O(1) | 不稳定 |
插入排序 | 维护一个有序区,把元素一个个插入有序区的适当位置,直到所有元素有序位置。 | O() | O() | O(1) | 稳定 |
希尔排序 | (插入排序的升级)将原始数组逐步分组粗调,再进行插入排序的思想 | O((nlogn)^2) | O((nlogn)^2) | O(1) | 不稳定 |
归并排序 | 先分组后归并(三个指针) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
计数排序 | O(n+m) | O(n+m) | O(m) | 稳定 | |
基数排序 | 把字符串元素按位拆分,每一位进行依次计数排序。 | O(n+m) | O(n+m) | O(n+m) | 稳定 |
桶排序 | 创建桶,并确定每一个桶的区间范围;遍历原始数列,把元素对号入座放入各个桶中;对每个桶内的元素分别进行排序;遍历所有的桶,输出所有元素。 | O(n) | O(n) | O(n) | 稳定 |
堆排序 | 1、把无序数组构建成二叉堆。需要从小到大排序,则构建成最大堆;需要从大到小排序,则构建最小堆;2、循环删除栈顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。 | O(nlogn) | O(nlogn) | O(1) | 不稳定 |