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

本文介绍了快速排序的基本思想和步骤,详细解释了如何通过分治法实现数组的排序,并提供了Java语言的具体实现代码。此外还讨论了快速排序的时间复杂度及其优化方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值