.
|
Алгоритм |
Структура данных |
|
Быстрая сортировка |
Бинарные деревья поиска |
|
Быстрая сортировка с составными ключами |
Троичные деревья поиска |
|
Поразрядная сортировка |
Боры |
sort(s, n, d) if n Ј 1 or d > k return; выбрать расщепляющее значение v; разбить s по значению v компоненты с номером d, получив последовательности s<,s=,s> длины которых n<, n=, n>; sort(s<, n<, d); sort(s=, n=, d + 1); sort(s>, n>, d); |
void ssort1main(char *x[], int n); |
#define swap(a, b) { char *t=x[a]; \
x[a]=x[b]; x[b]=t; }
#define i2c(i) x[i][dept h]
|
void vecswap(int i, int j, int n, char *x[])
{
do {
swap(i, j);
i++;
j++;
} while(--n);
}
|
void ssort1main(char *x[], int n)
{ ssort 1(x, n, 0); }
|
.
|
Машина |
MHz |
Системная |
Простая |
Улучшенная |
Поразрядная (Radix) |
|
MIPC R4400 |
150 |
.85 |
.79 |
.44 |
.40 |
|
MIPC R4000 |
100 |
1.32 |
1.30 |
.68 |
.62 |
|
Pentium |
90 |
1.74 |
.98 |
.69 |
.50 |
|
486DX |
33 |
8.20 |
4.15 |
2.41 |
1.74 |
void ssort1(char *x[], int n, int depth)
{
int a, b, c, d, r, v;
if (n <= 1)
return;
a = rand() % n;
swap(0, a);
v = i2c(0);
a = b = 1;
c = d = n-1;
for (;;) {
while (b <= c && (r = i2c(b)-v) <= 0) {
if (r == 0) { swap(a, b); a++; }
b++;
}
while (b <= c && (r = i2c(c)-v) >= 0) {
if (r == 0) { swap(c, d); d--; }
c--;
}
if (b > c) break;
swap(b, c);
b++;
c--;
}
r = min(a, b-a); vecswap(0, b-r, r, x);
r = min(d-c, n-d-1); vecswap(b, n-r, r, x);
r = b-a; ssort1(x, r, depth);
if (i2c(r) != 0)
ssort1(x + r, a + n-d-1, depth+1);
r = d-c; ssort1(x + n-r, r, depth);
}
|