整理下前一阵学的排序算法(2)

来源:互联网 发布:捉握手包软件 编辑:程序博客网 时间:2024/05/16 00:33

归并排序和快速排序

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]达成    }}
0 0
原创粉丝点击