输入n个数,对这n个数升序排列
希尔排序;时间复杂度O(n^3/2);
#include<iostream>using
namespace std;int
main(){ int
T; cin >> T; while
(T--) { int
n; cin >> n; int
a[100001]; for
(int
i = 1; i <= n; i++) cin >> a[i]; for
(int
gap = n / 2; gap > 0; gap = gap / 2) { for
(int
i = 0; i < gap; i++) { for
(int
j = i + gap; j <= n; j=j+gap) { if
(a[j] < a[j - gap]) { int
t = a[j], k = j - gap; while
(k > 0 && a[k] > t) { a[k + gap] = a[k]; k = k - gap; } a[k + gap] = t; } } } } for
(int
i = 1; i <= n; i++) { if
(i == n) cout << a[i] << endl; else
cout << a[i] << ' '; } } return
0;}堆排序;时间复杂度O(n*log2 n);
#include<iostream>#include<algorithm>int
a[100004], s;using
namespace std;int
main(){ void
insert(int); void
delet(); int
T; cin >> T; while
(T--) { int
n; cin >> n; s = n; for
(int
i = 1; i <= n; i++) { cin >> a[i]; insert(i); } for
(int
p = 1; p <= n; p++) { if
(p == n)cout << a[1] << endl; else
cout << a[1] << ' '; delet(); } } return
0;}void
insert(int w){ for
(int
j = 1; ; j++) { if
(w <=1) return; if
(a[w] < a[w / 2]) { swap(a[w], a[w / 2]); w = w / 2; } else
return; }}void
delet(){ a[1] = a[s]; s--;
int k = 1; for
(int
j = 1; ; j++) { if
(2 * k > s) return; else
if (2 * k == s) { if
(a[k] > a[2 * k]) swap(a[k], a[2 * k]); k = 2 * k; } else
if (a[k] > a[2 * k] || a[k] > a[2 * k + 1]) { if
(a[2 * k] < a[2 * k + 1]) { swap(a[k], a[2 * k]); k = 2 * k; } else { swap(a[k], a[2 * k + 1]); k = 2 * k + 1; } } else
return; }}
655

被折叠的 条评论
为什么被折叠?



