1 public class QuickSort {
7 * Sort an array of Objects into ascending order. The sort algorithm is an optimised
8 * quicksort, as described in Jon L. Bentley and M. Douglas McIlroy's
9 * "Engineering a Sort Function", Software-Practice and Experience, Vol.
10 * 23(11) P. 1249-1265 (November 1993). This algorithm gives nlog(n)
11 * performance on many arrays that would take quadratic time with a standard
14 * @param a the array to sort
16 public void sort(Object[] a)
18 qsort(a, 0, a.length);
21 public void sort(Object[] a, int fromIndex, int toIndex)
23 qsort(a, fromIndex, toIndex);
26 private int med3(int a, int b, int c, Object[]d)
28 if(less(d[a], d[b])) {
29 if(less(d[b], d[c])) {
38 if(less(d[c], d[b])) {
49 private void swap(int i, int j, Object[] a)
56 private void qsort(Object[] a, int start, int n)
58 // use an insertion sort on small arrays
61 for (int i = start + 1; i < start + n; i++)
62 for (int j = i; j > 0 && less(a[j], a[j - 1]); j--)
67 int pm = n / 2; // small arrays, middle element
71 int pn = start + n - 1;
74 { // big arrays, pseudomedian of 9
76 pl = med3(pl, pl + s, pl + 2 * s, a);
77 pm = med3(pm - s, pm, pm + s, a);
78 pn = med3(pn - 2 * s, pn - s, pn, a);
80 pm = med3(pl, pm, pn, a); // mid-size, med of 3
83 int pa, pb, pc, pd, pv;
89 pc = pd = start + n - 1;
93 while (pb <= pc && (r = diff(a[pb],a[pv])) <= 0)
102 while (pc >= pb && (r = diff(a[pc],a[pv])) >= 0)
119 s = Math.imin(pa - start, pb - pa);
120 vecswap(start, pb - s, s, a);
121 s = Math.imin(pd - pc, pn - pd - 1);
122 vecswap(pb, pn - s, s, a);
123 if ((s = pb - pa) > 1)
125 if ((s = pd - pc) > 1)
129 private void vecswap(int i, int j, int n, Object[] a)
131 for (; n > 0; i++, j++, n--)
135 public boolean less(Object x, Object y) {
136 Query aQueryPtr = (Query) x;
137 Query bQueryPtr = (Query) y;
138 if(aQueryPtr.index < bQueryPtr.index)
143 public int diff(Object x, Object y) {
144 Query aQueryPtr = (Query) x;
145 Query bQueryPtr = (Query) y;
146 return (aQueryPtr.index - bQueryPtr.index);
150 * main to test quick sort
153 public static void main(String[] args) {
154 QuickSort qs = new QuickSort();
155 Query[] queries = new Query[10];
157 Random r = new Random();
161 for(int i = 0; i<10; i++) {
162 queries[i] = new Query();
163 queries[i].index = (int) (r.random_generate() % 100);
164 queries[i].value = -1;
167 System.out.println("Before sorting");
168 for(int i = 0; i<10; i++)
169 System.out.println("queries["+i+"]= "+ queries[i]);
173 System.out.println("After sorting");
174 for(int i = 0; i<10; i++)
175 System.out.println("queries["+i+"]= "+ queries[i]);