Алгоритм |
Структура данных |
Быстрая сортировка |
Бинарные деревья поиска |
Быстрая сортировка с составными ключами |
Троичные деревья поиска |
Поразрядная сортировка |
Боры |
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); } |