diff options
Diffstat (limited to 'code/tools/lcc/tst/sort.c')
-rw-r--r-- | code/tools/lcc/tst/sort.c | 65 |
1 files changed, 0 insertions, 65 deletions
diff --git a/code/tools/lcc/tst/sort.c b/code/tools/lcc/tst/sort.c deleted file mode 100644 index a0cff62..0000000 --- a/code/tools/lcc/tst/sort.c +++ /dev/null @@ -1,65 +0,0 @@ -int in[] = {10, 32, -1, 567, 3, 18, 1, -51, 789, 0}; - -main() { - int i; - - sort(in, (sizeof in)/(sizeof in[0])); - for (i = 0; i < (sizeof in)/(sizeof in[0]); i++) { - putd(in[i]); - putchar('\n'); - } - return 0; -} - -/* putd - output decimal number */ -putd(n) { - if (n < 0) { - putchar('-'); - n = -n; - } - if (n/10) - putd(n/10); - putchar(n%10 + '0'); -} - -int *xx; - -/* sort - sort a[0..n-1] into increasing order */ -sort(a, n) int a[]; { - quick(xx = a, 0, --n); -} - -/* quick - quicksort a[lb..ub] */ -quick(a, lb, ub) int a[]; { - int k, partition(); - - if (lb >= ub) - return; - k = partition(a, lb, ub); - quick(a, lb, k - 1); - quick(a, k + 1, ub); -} - -/* partition - partition a[i..j] */ -int partition(a, i, j) int a[]; { - int v, k; - - j++; - k = i; - v = a[k]; - while (i < j) { - i++; while (a[i] < v) i++; - j--; while (a[j] > v) j--; - if (i < j) exchange(&a[i], &a[j]); - } - exchange(&a[k], &a[j]); - return j; -} - -/* exchange - exchange *x and *y */ -exchange(x, y) int *x, *y; { - int t; - - printf("exchange(%d,%d)\n", x - xx, y - xx); - t = *x; *x = *y; *y = t; -} |