方法一:插入排序
O(N^2)
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
for (int i = 1; i < n; i ++)
{
int tmp = a[i];
int j;
for (j = i; j > 0 && a[j - 1] > tmp; j --)
a[j] = a[j - 1];
a[j] = tmp;
}
for (int i = 0; i < n - 1; i ++)
printf("%d ", a[i]);
cout << a[n - 1];
return 0;
}
方法二:希尔排序
O(N^2)
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
for (int d = n / 2; d; d /= 2)
for (int i = d; i < n; i ++)
{
int tmp = a[i];
int j;
for (j = i; j >= d && a[j - d] > tmp; j -= d)
a[j] = a[j - d];
a[j] = tmp;
}
for (int i = 0; i < n - 1; i ++)
printf("%d ", a[i]);
cout << a[n - 1];
return 0;
}
方法三:堆排序
O(NlogN)
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int a[N];
// 将以root为根节点的堆调整成大根堆
void precdown(int root, int len)
{
int tmp = a[root];
int parent, child;
for (parent = root; (parent * 2 + 1) < len; parent = child)
{
child = parent * 2 + 1; // 左儿子节点
if (child + 1 < len && a[child + 1] > a[child]) child ++;
if (a[child] > tmp)
a[parent] = a[child];
else break;
}
a[parent] = tmp;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
// 遍历所有根节点,建立大根堆
for (int i <