选择排序、插入排序、希尔排序
class Sort{ //选择排序 public static void Selection_sort(Comparable[] a){ int N = a.length; for(int i = 0; i < N; i++){ int min = i; for(int j = i+1; j < N; j++){ if(less(a[i], a[min])) min = j; } exch(a, i, min); } } //插入排序 public static void Insertion_sort(Comparable[] a){ int N = a.length; for(int i = 1; i < N; i++){ for(int j = i; j > 0 && less(a[j], a[j-1]); j--){ exch(a, j, j-1); } } } //希尔排序 public static void Shell_sort(Comparable[] a){ int N = a.length; int h = 1; while(h < N/3) h = 3*h + 1; while(h >= 1){ for(int i = h; i < N; i++){ for(int j = i; j >= h && less(a[j], a[j - h]); j -= h){ exch(a, j, j - h); } } h = h/3; } } private static boolean less(Comparable v, Comparable w){ return v.compareTo(w) < 0; } private static void exch(Comparable[] a, int i, int j){ Comparable t = a[i]; a[i] = a[j]; a[j] = t; } private static void show(Comparable[] a){ for(int i = 0; i < a.length; i++){ System.out.print(a[i] + " "); } System.out.println(); } public static boolean isSorted(Comparable[] a){ for(int i = 1; i < a.length; i++){ if(less(a[i], a[i - 1])) return false; } return true; } }
归并排序
//归并排序所需的时间和NlgN成正比 //主要缺点:辅助数组所占的空间和N大小成正比 class Merge{ private static Comparable[] aux; public static void sort(Comparable[] a){ aux = new Comparable[a.length]; sort(a, 0 ,a.length - 1); } private static void sort(Comparable[] a, int lo, int hi){ if( hi <= lo) return; int mid = lo + (hi - lo)/2; sort(a, lo, mid); sort(a, mid + 1, hi); merge(a, lo, mid, hi); } public static void merge(Comparable[] a, int lo, int mid, int hi){ int i = lo, j = mid + 1; for(int k = lo; k <= hi; k++){ aux[k] = a[k]; } for(int k = lo; k <= hi; k++){ if(i > mid) a[k] = aux[j++]; else if(j > hi) a[k] = aux[i++]; else if(less(a[j], aux[i])) a[k] = aux[j++]; else a[k] = aux[i++]; } } private static boolean less(Comparable v, Comparable w){ return v.compareTo(w) < 0; } private static void exch(Comparable[] a, int i, int j){ Comparable t = a[i]; a[i] = a[j]; a[j] = t; } private static void show(Comparable[] a){ for(int i = 0; i < a.length; i++){ System.out.print(a[i] + " "); } System.out.println(); } public static boolean isSorted(Comparable[] a){ for(int i = 1; i < a.length; i++){ if(less(a[i], a[i - 1])) return false; } return true; } }
快速排序
//最多需要N*N/2 class Quick{ public static void sort(Comparable[] a){ sort(a, 0, a.length - 1); } private static void sort(Comparable[] a, int lo, int hi){ if( hi <= lo) return; int j = partition(a, lo, hi); sort(a, lo, j - 1); sort(a, j + 1, hi); } private static int partition(Comparable[] a, int lo, int hi){ int i = lo, j = hi + 1; Comparable v = a[lo]; while(true){ while(less(a[++i], v)) if(i == hi) break; while(less(v, a[--j])) if(j == lo) break; if(i >= j) break; exch(a, i, j); } exch(a, lo, j); return j; } private static boolean less(Comparable v, Comparable w){ return v.compareTo(w) < 0; } private static void exch(Comparable[] a, int i, int j){ Comparable t = a[i]; a[i] = a[j]; a[j] = t; } private static void show(Comparable[] a){ for(int i = 0; i < a.length; i++){ System.out.print(a[i] + " "); } System.out.println(); } public static boolean isSorted(Comparable[] a){ for(int i = 1; i < a.length; i++){ if(less(a[i], a[i - 1])) return false; } return true; } }