算法/排序算法/QuickSort快速排序

快速排序基于分治的思想,该方法的基本思路是:

  1. 先从数列中取出一个数作为基准数。
  2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  3. 再对左右区间重复第二步,直到各区间只有一个数。

一趟快速排序的算法是:

  1. 设置两个变量 i、j,排序开始的时候:i=0,j=N-1
  2. 以第一个数组元素作为关键数据 key
  3. 从 j 开始向前搜索,找到第一个小于 key 的值与 key 交换
  4. 从 i 开始向后搜索,找到第一个大于 key 的值与 key 交换
  5. 重复第3、4步,直到 i=j,将对应的值与 key 交换

这个过程还可以优化:j 向前扫描时遇到比 key 小的值暂不交换,停止扫描并使 i 开始向后扫描,等到 i 对应的值大于 key 时,直接交换 i 和 j 对应的值,然后继续扫描直到 i、j 相遇,扫描和交换的过程结束。这时 i 左边的值都小于基准值,右边的值都不小于基准值,即 key 回到正确的位置。然后就可以分别对这两部分进行快速排序。

算法/排序算法/QuickSort快速排序_第1张图片


java代码如下:

public class QuickSort {

    private final static int MAX_NUM = 10;

    public static void main(String args[]) {
        int[] array = new int[MAX_NUM];
        Scanner scanner = new Scanner(System.in);

        for (int i = 0; i < array.length; i++) {
            array[i] = scanner.nextInt();
        }

        for (int i : array) {
            System.out.print(i + " ");
        }

        System.out.println();

        int low = 0;
        int high = array.length - 1;
        QuickSort tQS = new QuickSort();
        tQS.quickSort(array, low, high);

        for (int i : array) {
            System.out.print(i + " ");
        }
    }


    void quickSort(int[] array, int low, int high) {
        int i = low;
        int j = high;
        int key = array[low];

        while (i < j) {

            while (array[j] >= key && i < j) {
                j--;
            }

            while (array[i] <= key && i < j) {
                i++;
            }

            if (i < j) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }

        array[low] = array[i];
        array[i] = key;

        if (i > low) {
            quickSort(array, low, i - 1);
        }
        if (j < high) {
            quickSort(array, i + 1, high);
        }

    }
}

快速排序的平均时间复杂度为O(nlgn),最坏情况时间可达到O(n^2):当要排序的数据基本有序的时候。我们知道,当把数列平均分成两个等长的数列时效率最高,两部分相差越大效率越低。
为降低最坏情况出现的几率,我们可以采用一种优化的算法 随机快速排序

你可能感兴趣的:(算法导论)