快速排序

来源:互联网 发布:mac强制卸载程序 编辑:程序博客网 时间:2024/06/06 23:18

快速排序算法是一种分治的排序算法。将一个数组分成两个子数组,将两部分独立的排序。
在快速排序中,递归调用发生在数组处理之后,且切分的位置取决于数组内容。

Java版代码:

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(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;}

该方法关键在于切分:
a[j]已排定
a[lo]到a[j-1]中所有元素都不大于a[j]
a[j+1]到a[hi]中所有元素都不小于a[j]

Python版代码:

def quick_sort(lst):    qsort_rec(lst, 0, len(lst) - 1)def qsort_rec(lst, l, r):    if l >= r:        return    i = l    j = r    pivot = lst[i]    while i < j:        while i < j and lst[j].key >= pivot.key:            j -=1        if i < j:            lst[i] = lst[j]            i += 1        while i < j and lst[i].key <= pivot.key:            i += 1        if i < j:            lst[j] = lst[i]            j -= 1        lst[i] = pivot        qsort_rec(lst, l, i-1)        qsort_rec(lst, i+1, r)