输入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
;
}
}