implement util.Sort
[nestedvm.git] / src / org / ibex / nestedvm / util / Sort.java
1 package org.ibex.nestedvm.util;
2
3 public final class Sort {
4     private Sort() { }
5     
6     public interface Comparable { public int compareTo(Object o); }
7     public interface CompareFunc { public int compare(Object a, Object b); }
8     
9     private static final CompareFunc comparableCompareFunc = new CompareFunc() {
10         public int compare(Object a,Object b) { return ((Comparable)a).compareTo(b); }
11     };
12     
13     public static void sort(Comparable[] a) { sort(a,comparableCompareFunc); }
14     public static void sort(Object[] a, CompareFunc c) { sort(a,c,0,a.length-1); }
15     
16     private static void sort(Object[] a, CompareFunc c, int start, int end) {
17         Object tmp;
18         if(start >= end) return;
19         if(end-start <= 6) {
20             for(int i=start+1;i<=end;i++) {
21                 tmp = a[i];
22                 int j;
23                 for(j=i-1;j>=start;j--) {
24                     if(c.compare(a[j],tmp) <= 0) break;
25                     a[j+1] = a[j];
26                 }
27                 a[j+1] = tmp;
28             }
29             return;
30         }
31         
32         Object pivot = a[end];
33         int lo = start - 1;
34         int hi = end;
35         
36         do {
37             while((lo < hi) && c.compare(a[++lo],pivot) < 0) { }
38             while((hi > lo) && c.compare(a[--hi],pivot) > 0) { }
39             tmp = a[lo]; a[lo] = a[hi]; a[hi] = tmp;
40         } while(lo < hi);
41         
42         tmp = a[lo]; a[lo] = a[end]; a[end] = tmp;
43         
44         sort(a, c, start, lo-1);
45         sort(a, c, lo+1, end);
46     }
47 }