【算法】快速排序的原理与Java实现

简介: 快速排序(Quick Sort)是一种常用且高效的排序算法,基于分治(Divide and Conquer)策略。它的基本思想是选择一个基准元素,通过将待排序的数组划分为两个子数组,使得左边的子数组中的元素都小于等于基准元素,右边的子数组中的元素都大于等于基准元素。然后对左右子数组分别进行快速排序,最终将排序好的子数组合并起来,得到完整的有序数组。

一.快速排序原理


快速排序(Quick Sort)是一种常用且高效的排序算法,基于分治(Divide and Conquer)策略。它的基本思想是选择一个基准元素,通过将待排序的数组划分为两个子数组,使得左边的子数组中的元素都小于等于基准元素,右边的子数组中的元素都大于等于基准元素。然后对左右子数组分别进行快速排序,最终将排序好的子数组合并起来,得到完整的有序数组。


快速排序的具体步骤如下:

1.选择基准元素:从待排序的数组中选择一个元素作为基准(通常选择第一个元素或最后一个元素)。

2.划分操作:将数组中小于等于基准元素的元素放在基准元素的左边,将大于等于基准元素的元素放在基准元素的右边,使得基准元素的位置确定。

3.递归排序:对基准元素左边的子数组和右边的子数组分别进行快速排序,重复步骤2。

4.合并结果:将左边子数组、基准元素、右边子数组合并起来,得到最终的有序数组。


二.使用Java实现快速排序


public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 3, 1};
        System.out.println("Before sorting:");
        printArray(arr);
        quickSort(arr, 0, arr.length - 1);
        System.out.println("After sorting:");
        printArray(arr);
    }
    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(arr, low, high); // 划分操作,获取基准元素的位置
            // 递归排序基准元素左边的子数组和右边的子数组
            quickSort(arr, low, pivotIndex - 1);
            quickSort(arr, pivotIndex + 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++;
                // 将小于等于基准元素的元素交换到左边
                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 void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

以上代码使用快速排序算法对一个整数数组进行排序。quickSort方法实现了快速排序的逻辑,首先选择一个基准元素,并通过划分操作将数组中小于等于基准元素的元素放在基准元素的左边,大于等于基准元素的元素放在基准元素的右边。然后对左右子数组分别进行快速排序,最终合并结果。partition方法用于执行划分操作,确定基准元素的位置。


运行以上代码,将输出如下结果:

Before sorting:
5 2 8 3 1 
After sorting:
1 2 3 5 8

快速排序算法的时间复杂度为O(nlogn),其中n是数组的长度。它是一种不稳定的排序算法,适用于任何规模的数组。由于其平均时间复杂度较低且具有原地排序的特性,快速排序是一种常用的排序算法。

相关文章
机器学习/深度学习 算法 自动驾驶
113 0
|
20天前
|
机器学习/深度学习 算法 搜索推荐
从零开始构建图注意力网络:GAT算法原理与数值实现详解
本文详细解析了图注意力网络(GAT)的算法原理和实现过程。GAT通过引入注意力机制解决了图卷积网络(GCN)中所有邻居节点贡献相等的局限性,让模型能够自动学习不同邻居的重要性权重。
92 0
从零开始构建图注意力网络:GAT算法原理与数值实现详解
|
28天前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
256 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
1月前
|
传感器 算法 定位技术
KF,EKF,IEKF 算法的基本原理并构建推导出四轮前驱自主移动机器人的运动学模型和观测模型(Matlab代码实现)
KF,EKF,IEKF 算法的基本原理并构建推导出四轮前驱自主移动机器人的运动学模型和观测模型(Matlab代码实现)
|
1月前
|
算法
离散粒子群算法(DPSO)的原理与MATLAB实现
离散粒子群算法(DPSO)的原理与MATLAB实现
86 0
|
2月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
88 0
|
2月前
|
机器学习/深度学习 人工智能 编解码
AI视觉新突破:多角度理解3D世界的算法原理全解析
多视角条件扩散算法通过多张图片输入生成高质量3D模型,克服了单图建模背面细节缺失的问题。该技术模拟人类多角度观察方式,结合跨视图注意力机制与一致性损失优化,大幅提升几何精度与纹理保真度,成为AI 3D生成的重要突破。
172 0
|
2月前
|
存储 缓存 安全
深入讲解 Java 并发编程核心原理与应用案例
本教程全面讲解Java并发编程,涵盖并发基础、线程安全、同步机制、并发工具类、线程池及实际应用案例,助你掌握多线程开发核心技术,提升程序性能与响应能力。
111 0
|
2月前
|
算法 区块链 数据安全/隐私保护
加密算法:深度解析Ed25519原理
在 Solana 开发过程中,我一直对 Ed25519 加密算法 如何生成公钥、签名以及验证签名的机制感到困惑。为了弄清这一点,我查阅了大量相关资料,终于对其流程有了更清晰的理解。在此记录实现过程,方便日后查阅。
158 1