0
点赞
收藏
分享

微信扫一扫

自顶向下与自底向上的快速排序

秦瑟读书 2022-01-06 阅读 35

本节的主题是快速排序,它可能是运用最为广泛的排序了,因为它很快.相比于其它算法而言,它适用于各种不同的输入数据且在一般应用中比其它算法快得多,快速排序引人注目的是它只需要一个小小的辅助栈,且将长度为N的数组排序所需要的时间和NlogN成正比,我们已经学习过的算法都无法同时结合这两个优点.

该算法的关键部分在于切分,这个过程满足以下三个条件:

  • 对于某个j,A[j]已经排定

  • A[lo]到到A[j-1]所有元素都不大于A[j]

  • A[j+1]到A[hi]所有元素都不小于A[j]

我们就是通过不断的地切分来进行快速排序的.

代码部分

public class Quick {
    public static void main(String[] args) {
        int A[] = { 12, 234, 4, 3, 123, 5, 32, 64, 13, 1, 3, 13, 12, 89};
        sort(A, 0, A.length - 1);
        show(A);
    }
​
    public static void show(int[] A) {
    for(int i = 0; i < A.length; i++)
    System.out.print(A[i]+"  ");
}
    public static void sort(int[] 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);    
    }
​
    public static int partition(int[] A, int lo, int hi) {
        //将分组切割为A[lo..i-1],A[i],A[i+1..hi]
        int i = lo, j = hi + 1;
        int v = A[lo];
        while (true) {
            //扫描左右,检查扫描是否结束并且交换元素
            while (A[++i] > v)
                if (i == hi)
                    break;
            while (A[--j] < v)
                if (j == lo)
                    break;
            if (i >= j)
                break;
            exch(A, i, j);
        }
        exch(A, lo, j);
        return j;
    }
​
    public static void exch(int[] A, int i, int j) {
        int temp = A[i];
        A[j] = A[i];
        A[i] = temp;
    }
}
​
举报

相关推荐

计算机网络自顶向下方法

0 条评论