当前位置: 首页 > news >正文

【基础3】快速排序

核心思路

快速排序是Java中Arrays.sort()的实现原理,采用分治策略,通过选择基准元素,将数组分为两个子数组,使得左边元素 ≤ 基准元素 ≤ 右边元素,然后递归排序子数组。

举个简单的例子,图书管理员需要按照书本厚度对一箱书进行排序,使用快速排序就是先选择一本书作为中间基准,把厚的书放在它右边,薄的书放在它左边。(这里左右两边内部是无序的)

处理完后再对它左边的书分别快速排序(即选出新的基准元素,厚的放右边,薄的放左边),同理右边也是一样,最后就得到完整的序列。

复杂度
情况时间复杂度空间复杂度
最好情况O(n logn)O(logn)
最坏情况O(n²)O(n)
平均情况O(n logn)O(logn)
优缺点

优点

  1. 平均情况下最快的比较排序算法
  2. 原地排序(不需要额外内存)
  3. 高度可优化

缺点

  1. 最坏情况时间复杂度较高
  2. 不稳定排序
  3. 递归实现需要栈空间

适用场景

  • 大规模数据排序
  • 需要高效率的通用排序
  • 内存受限环境
代码实现(Java)
public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {5, 3, 8, 4, 2};
        quickSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(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); 
        }
    }

    /**
     * 分区(这里以最后一个元素为基准)
     */
    private static int partition(int[] arr, int low, int high) {
        //基准元素
        int pivot = arr[high]; 
        //小元素区间的左边界
        int i = low - 1;       

        //i+1实际上就是最后基准元素要被移到的位置
        for (int j = low; j < high; j++) {
            //把小于基准的元素不断向左靠拢(比基准大的元素也被动地向右边移动),
            //最后[low,i]的元素都比基准小,那么i+1的位置自然就留给基准元素了
            if (arr[j] <= pivot) {
                i++;
                swap(arr, i, j);
            }
        }

        //移动基准元素
        swap(arr, i + 1, high); 
        return i + 1;
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
排序过程

初始数组:[5, 3, 8, 4, 2]

第1次分区(pivot=2)

移动元素:5>2,3>2,8>2,4>2 → 无交换  
最终交换基准 → [2, 3, 8, 4, 5]
返回位置0

递归左半部(空数组)和右半部[3,8,4,5]

第2次分区(pivot=5)

排序数组:[3,8,4,5]  
移动元素:3<5,8>5,4<5 → 交换8和4  
最终数组:[3,4,5,8]  
返回位置2

递归处理左右子数组

左半部[3,4] → 最终排序[3,4]  
右半部[8] → 保持原样

最终结果

[2, 3, 4, 5, 8]

相关文章:

  • 嵌入式科普(34)通过对比看透DMA的本质
  • 第四十一:Axios 模型的 get ,post请求
  • C++----异常
  • Python数据可视化
  • PX4中的uavcan进程
  • python全栈-Linux基础
  • 策略模式处理
  • AI工具:deepseek+阶跃视频,生成好玩的视频
  • 教育强国建设“三年行动计划“分析
  • 如何快速上手RabbitMQ 笔记250304
  • docker-compose安装anythingLLM
  • 2000-2020年各省地方财政一般预算支出数据
  • 鸿蒙5.0实战案例:基于ArkUI的透明页面效果
  • c++中什么时候应该使用extern关键字?
  • 全栈(Java+vue)实习面试题(含答案)
  • Django项目实战
  • 基于opencv消除图片马赛克
  • 项目工坊|Python驱动淘宝信息爬虫
  • Python和PyQt5写的密码记录工具
  • 三方库总结
  • 橙子建站和今日头条什么关系/宁波seo软件
  • 西安网站seo价格/百度店面定位怎么申请
  • 网页工具栏怎么还原/百度seo是什么意思
  • tp框架做展示网站/人大常委会委员长
  • 公司网站建设应注意什么/重庆seo海洋qq
  • 怎么做简单的微信浏览的网站/长沙关键词优化新报价