当然这些都是废话直接sort多好。。。
1 //放眼望去。。。好眼熟啊。。。 2 //当然身为神犇大佬的你不希望自己渺小到只会用sort。。。 3 #include<bits/stdc++.h> 4 using namespace std; 5 const int MAXN = 1e8 + 10; 6 int n, a[MAXN]; 7 int main(){ 8 scanf("%d", &n); 9 for (int i = 1;i <= n; i++) scanf("%d", &a[i]); 10 sort(a + 1, a + 1 + n);//<--!!!!!AC必备经典代码。。。。。 11 for (int i = 1;i <= n; i++) printf("%d ", a[i]); puts(""); 12 return 0;
像上面这样简洁的代码难道不XIANG吗。。。(蒟蒻的心里话)
切入正题:
十种常见排序算法可以分为两大类:
比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 包括插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序和归并排序
非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。包括计数排序、桶排序和基数排序
算法时/空复杂度:
插入排序:平均时间复杂度O(n^2),最坏时间复杂度O(n^2)),最好时间复杂度O(n),空间复杂度O(1)
希尔排序:平均时间复杂度O(n^1.3),最坏时间复杂度O(n^2),最好时间复杂度O(n),空间复杂度O(1)
选择排序:平均时间复杂度O(n^2),最坏时间复杂度O(n^2),最好时间复杂度O(n^2),空间复杂度O(1)
堆排序:平均时间复杂度O(n log2? n),最坏时间复杂度O(n log2 n),最好时间复杂度O(n log2 n),空间复杂度O(1)