快速排序算法

来源:互联网 发布:蓝光 刻录 数据 编辑:程序博客网 时间:2024/06/06 13:22

快速排序算法是基于分治策略的另一个算法。其基本思想是,对于输入的子数组 a[p:r],按照以下三个步骤进行排序。

①分解(divide):以 a[p] 为基准元素将 a[p:r] 划分为3段 a[p:q-1],a[q],a[q+1:r],使得 a[p:q-1] 中的任何元素小于等于 a[q],使得 a[q+1:r] 中的任何元素大于等于 a[q]。

②递归求解:通过递归调用快速排序算法,分别对 a[p:q-1],a[q+1:r] 进行排序。

③合并:由于对 a[p:q-1] 和 a[q+1:r] 的排序是就地进行的,所以在 a[p:q-1] 和 a[q+1:r] 都已排好的序后不再需要执行任何计算,a[p:r] 就已排好序。

基于这个思想,可实现快速排序算法如下:

private static void quickSort(int p, int r) {        if(p<r) {            int q = partition(p,r);            quickSort(p,q-1);            quickSort(q+1,r);        }    }

在main函数中只需要用数组对象,调用quickSort()方法即可。

private static int partition(int p, int r) {        int i = p;        int j = r+1;        Comparable x = a[p];        //将<x的元素交换到左边区域        //将>x的元素交换到右边区域        while(true) {            while(a[++i].compareTo(x)<0 && i<r);            while(a[--j].compareTo(x)>0);            if(i>=j) break;            MyMath.swap(a,i,j);        }        a[p] = a[j];        a[j] = x;        return j;    }

上述算法中的partition,以确定的基准元素 a[p] 对子数组 a[p:r] 进行划分,它是快速排序算法的关键。