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

来源:互联网 发布:宜搜小说软件下载 编辑:程序博客网 时间:2024/05/18 01:41

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

  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 回到正确的位置。然后就可以分别对这两部分进行快速排序。

一次排序


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):当要排序的数据基本有序的时候。我们知道,当把数列平均分成两个等长的数列时效率最高,两部分相差越大效率越低。
为降低最坏情况出现的几率,我们可以采用一种优化的算法 随机快速排序

0 0
原创粉丝点击