summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/rg_qsort.c2
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/rg_qsort.c2')
-rwxr-xr-xreference/C/CONTRIB/SNIP/rg_qsort.c250
1 files changed, 50 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/rg_qsort.c2 b/reference/C/CONTRIB/SNIP/rg_qsort.c2
new file mode 100755
index 0000000..413ccab
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/rg_qsort.c2
@@ -0,0 +1,50 @@
+/*
+** quicksort.c -- quicksort integer array
+**
+** public domain by Raymond Gardner 12/91
+*/
+
+static void swap(int *a, int *b)
+{
+ register int t;
+
+ t = *a;
+ *a = *b;
+ *b = t;
+}
+
+void quicksort(int v[], unsigned n)
+{
+ unsigned i, j, ln, rn;
+
+ while (n > 1)
+ {
+ swap(&v[0], &v[n/2]);
+ for (i = 0, j = n; ; )
+ {
+ do
+ --j;
+ while (v[j] > v[0]);
+ do
+ ++i;
+ while (i < j && v[i] < v[0]);
+ if (i >= j)
+ break;
+ swap(&v[i], &v[j]);
+ }
+ swap(&v[j], &v[0]);
+ ln = j;
+ rn = n - ++j;
+ if (ln < rn)
+ {
+ quicksort(v, ln);
+ v += j;
+ n = rn;
+ }
+ else
+ {
+ quicksort(v + j, rn);
+ n = ln;
+ }
+ }
+}