归并排序和快速排序
1. 归并排序
原地归并的抽象方法
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(aux[j],aux[i])) a[k] = aux[j++];
else a[k] = aux[i++];
}
自顶向下的归并排序
public 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);
}
}
2. 快速排序
public class Quick
{
public static void sort(Comparable[] a)
{
StdRandom.shuffle(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(j == hi) break;
while(less(v, a[--j])) if(j == lo) break;
if(i >= j) break;
exch(a, i, j);
}
exch(a, lo, j); //将v = a[j]放入正确的位置
return j; //a[lo..j-1] <= a[j] <= a[j+1..hi]达成
}
}