Java算法系列第二篇:快速排序算法详解

Java算法系列第二篇:快速排序算法详解

快速排序(Quick Sort)是排序算法中最经典和高效的算法之一。它采用分治法策略,将一个序列分为两个子序列,通过递归的方式对其进行排序。本文将详细介绍快速排序的原理、实现及其优化方法。

一、快速排序的基本原理

快速排序通过以下步骤实现:

  1. 选择基准(Pivot):从序列中选择一个元素作为基准。
  2. 分区(Partition):将序列中小于基准的元素放在基准的左边,大于基准的元素放在基准的右边。
  3. 递归排序:对基准左边和右边的子序列分别进行快速排序。

通过上述步骤,整个序列逐步变得有序。

二、快速排序的实现

下面是一个用Java实现的快速排序算法:

public class QuickSort {

    // 快速排序主方法
    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high);
            quickSort(arr, low, pi - 1);
            quickSort(arr, pi + 1, high);
        }
    }

    // 分区方法
    public static int partition(int[] arr, int low, int high) {
        int pivot = arr[high];
        int i = (low - 1);
        for (int j = low; j < high; j++) {
            if (arr[j] <= pivot) {
                i++;
                // 交换arr[i]和arr[j]
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        // 交换arr[i + 1]和arr[high]
        int temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;

        return i + 1;
    }

    public static void main(String[] args) {
        int[] arr = {10, 7, 8, 9, 1, 5};
        System.out.println("排序前:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();

        quickSort(arr, 0, arr.length - 1);

        System.out.println("排序后:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}
运行结果
排序前:
10 7 8 9 1 5 
排序后:
1 5 7 8 9 10 
三、快速排序的优化方法

虽然快速排序的平均时间复杂度为O(n log n),但在最坏情况下(例如每次选择的基准都是当前序列中的最小或最大值),时间复杂度会退化为O(n^2)。为了避免这种情况,可以进行以下优化:

  1. 三数取中:选择低位、中位和高位三个元素的中间值作为基准。
  2. 随机化基准:随机选择一个元素作为基准,可以有效避免最坏情况。
  3. 小数组优化:当子序列长度较小时,使用插入排序替代快速排序。

下面是一个实现三数取中优化的示例:

public class OptimizedQuickSort {

    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high);
            quickSort(arr, low, pi - 1);
            quickSort(arr, pi + 1, high);
        }
    }

    public static int partition(int[] arr, int low, int high) {
        int pivot = medianOfThree(arr, low, high);
        int i = low - 1;
        for (int j = low; j < high; j++) {
            if (arr[j] <= pivot) {
                i++;
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        int temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;

        return i + 1;
    }

    public static int medianOfThree(int[] arr, int low, int high) {
        int mid = low + (high - low) / 2;
        if (arr[low] > arr[mid]) swap(arr, low, mid);
        if (arr[low] > arr[high]) swap(arr, low, high);
        if (arr[mid] > arr[high]) swap(arr, mid, high);
        swap(arr, mid, high);
        return arr[high];
    }

    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {10, 7, 8, 9, 1, 5};
        System.out.println("排序前:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();

        quickSort(arr, 0, arr.length - 1);

        System.out.println("排序后:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}
四、总结

快速排序是一个高效且应用广泛的排序算法。通过合理选择基准和优化分区过程,可以进一步提升其性能。在实际应用中,快速排序通常是排序算法的首选。

希望大家多多点赞、关注和收藏!你的支持是我持续创作的动力!下期我们将详细讲解归并排序算法,敬请期待!


这篇文章详细介绍了快速排序的原理、实现及其优化方法。如果你有任何问题或建议,欢迎在评论区留言!

Java算法系列

  1. Java算法系列第一篇:排序算法概述与实现

  2. Java算法系列第二篇:快速排序算法详解

  3. Java算法系列第三篇:归并排序算法详解

  4. Java算法系列第四篇:堆排序算法详解

  5. Java算法系列第五篇:插入排序算法详解

  6. Java算法系列第六篇:选择排序算法详解

  7. Java算法系列第七篇:桶排序算法详解

  8. Java算法系列第八篇:基数排序算法详解

  9. Java算法系列第九篇:计数排序算法详解

  10. Java算法系列第十篇:希尔排序算法详解

  11. Java算法系列第十一篇:计数排序算法详解

  12. Java算法系列第十二篇:归并排序算法详解

  13. Java算法系列第十三篇:树排序算法详解

  14. Java算法系列第十四篇:外部排序算法详解

  15. Java算法系列第十五篇:分布式排序算法详解

  16. Java算法系列第十六篇:贪心算法详解

  17. Java算法系列第十七篇:动态规划详解

  18. Java算法系列第十八篇:图算法中的最短路径算法

  19. Java算法系列第十九篇:最小生成树算法详解

  20. Java算法系列第二十篇:图遍历算法详解

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿里渣渣java研发组-群主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值