排序算法
时间空间分析表格
排序算法 | 平均 | 最优 | 最坏 | 空间 | 占用内存 | 稳定性 |
---|---|---|---|---|---|---|
冒泡排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | In-place1 | 稳定 |
选择排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | In-place | 不稳定 |
插入排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | In-place | 稳定 |
希尔排序 | O ( n ∗ l o g n O(n*logn O(n∗logn) | O ( n ∗ l o g 2 n ) O(n*log^2n) O(n∗log2n) | O ( n ∗ l o g 2 n ) O(n*log^2n) O(n∗log2n) | O ( 1 ) O(1) O(1) | In-place | 不稳定 |
归并排序 | O ( n ∗ l o g n ) O(n*logn) O(n∗logn) | O ( n ∗ l o g n ) O(n*logn) O(n∗logn) | O ( n ∗ l o g n ) O(n*logn) O(n∗logn) | O ( n ) O(n) O(n) | Out-place2 | 稳定 |
快速排序 | O ( n ∗ l o g n ) O(n*logn) O(n∗logn) | O ( n ∗ l o g n ) O(n*logn) O(n∗logn) | O ( n 2 ) O(n^2) O(n2) | O ( l o g n ) O(log n) O(logn) | In-place | 不稳定 |
堆排序 | O ( n ∗ l o g n ) O(n*logn) O(n∗logn) | O ( n ∗ l o g n ) O(n*logn) O(n∗logn) | O ( n ∗ l o g n ) O(n*log n) O(n∗logn) | O ( 1 ) O(1) O(1) | In-place | 不稳定 |
计数排序 | O ( n + k ) O(n + k) O(n+k) | O ( n + k ) O(n + k) O(n+k) | O ( n + k ) O(n + k) O(n+k) | O ( k ) O(k) O(k) | Out-place | 稳定 |
桶排序 | O ( n + k ) O(n + k) O(n+k) | O ( n + k ) O(n + k) O(n+k) | O ( n 2 ) O(n^2) O(n2) | O ( n + k ) O(n + k) O(n+k) | Out-place | 稳定 |
基数排序 | O ( n ∗ k ) O(n * k) O(n∗k) | O ( n ∗ k ) O(n * k) O(n∗k) | O ( n ∗ k ) O(n * k) O(n∗k) | O ( n + k ) O(n + k) O(n+k) | Out-place | 稳定 |
基于比较
基本排序
冒泡排序
从头到尾,交换所有相邻不和正序的两个数。
void bubbleSort(int a[], int n)
{
for(int i = n - 1; i > 0; i--)
for(int j = 0; j < i; j++)
if(a[j] > a[j+1])
swap(a[j], a[j+1]);
}
选择排序
从最小的一直找次小的,一直到全部找到。
在这里插入代码片
插入排序
一个一个按照输入顺序插入进一个有序的序列中。
在这里插入代码片
希尔排序
归并排序
分成两组,分别排序在合到一起,(分三种情况)
在这里插入代码片
快速排序
设置哨兵,比较与哨兵相差的大小来分成两个子序列,无限的循环 l o g n log n logn次每次 ∗ n *n ∗n,所以是 O ( n ∗ l o g n ) O(n*log n) O(n∗logn)
在这里插入代码片
在这里插入代码片
采用随机数取哨兵的方式可以规避卡数。
堆排序
不基于比较
计数排序
在这里插入代码片
桶排序
堆排序
对于1s的运行时限,设计的算法复杂度不能超过百万级别