选择排序、插入排序、希尔排序
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;
}
}