版权声明:本文为hzy原创文章,未经博主允许不可随意转载。 https://blog.csdn.net/Binary_Heap/article/details/82813384
排序
稳定性的含义:如果数组中存在两个不同位置元素 ,排完序后原来的 的相对位置发生了改变,则称这种排序是不稳定的(发生无意义的变换).
排序算法 | 最坏复杂度 | 平均复杂度 | 是否稳定 |
---|---|---|---|
插入排序 | 稳定 | ||
选择排序 | 不稳定 | ||
冒泡排序 | 稳定 | ||
快速排序 | 不稳定 | ||
归并排序 | 稳定 | ||
堆排序 | 不稳定 | ||
基数排序 | 稳定 |
基数排序中的 表示基数, 表示位数.
:
#include <cstdio>
const int MAXN = 1e5 + 10;
const int r = 13;
int n, cnt[r], a[MAXN], t[MAXN];
void radix_sort() {
int maxa = 0;
for(int i = 1; i <= n; i ++)
if(maxa < a[i]) maxa = a[i];
int d = 1, w;
for(; d <= maxa; d *= r) {
for(int i = 0; i < r; i ++) cnt[i] = 0;
for(int i = 1; i <= n; i ++) {
w = a[i] / d % r;
++ cnt[w];
}
for(int i = 1; i < r; i ++) cnt[i] += cnt[i - 1];
for(int i = n; i; i --) {
w = a[i] / d % r;
t[cnt[w] --] = a[i];
}
for(int i = 1; i <= n; i ++) a[i] = t[i];
}
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
radix_sort();
for(int i = 1; i <= n; i ++)
printf("%d%c", a[i], " \n"[i == n]);
return 0;
}
:
#include <cstdio>
const int MAXN = 1e5 + 10;
void swap(int & a, int & b) {
if(a ^ b) a ^= b ^= a ^= b;
}
int n, a[MAXN];
void qsort(int l, int r) {
if(l >= r) return ;
int mid = a[l + r >> 1], i = l, j = r;
do {
for(; a[i] < mid; ++ i) ;
for(; a[j] > mid; -- j) ;
if(i <= j) swap(a[i ++], a[j --]);
} while(i <= j) ;
qsort(l, j);
qsort(i, r);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
qsort(1, n);
for(int i = 1; i <= n; i ++)
printf("%d%c", a[i], " \n"[i == n]);
return 0;
}
主定理
这里大概介绍一下主定理,符号和语言可能不严谨.
如果某算法的计算时间可以用一下递推式表示:
多项式大于感性理解为:它们的商大于一个多项式。即 ,使得
例如 ,但是 .
(1) 若 ,则
(2) 若 ,则
(3) 若 ,则
例1(NOIP 2017 提高组初赛): ,则时间复杂度为:
, , ,因此 .