快速排序

简介: 快速排序是一个经典的排序,而且针对特定的问题,又分为2路快排和3路快排。今天,我们不搞这些复杂的,就搞经典快排。快速排序.png如图所示,快速排序如果遇到数组都有序的情况,那么快排将会退化成O(n^2),所以选择随机快排来更改这个情况。

快速排序是一个经典的排序,而且针对特定的问题,又分为2路快排和3路快排。今天,我们不搞这些复杂的,就搞经典快排。

img_8a265a2cbf522baadaf68681a3f7b364.png
快速排序.png

如图所示,快速排序如果遇到数组都有序的情况,那么快排将会退化成O(n^2),所以选择随机快排来更改这个情况。然后变成了一个概率事件,长期期望为O(n*logn)。
快排总体思路:
1.先将数组分开,小于基准的放左边,等于的放中间,大于的放右边,然后依次对左右进行
类似的操作。
2.关于partition函数,less相当于左边界,more相当于有边界,像 左) 数组 (右。
快排其实有两种思路,思路一是分成了小于区less区,大于区more区,然后每次将小于基准的放到小于区,小于区扩大一个,表现为less++;每次把大于基准的放到大于区,大于区扩大一个,表现为more--。
思路二是,选择一个基准,然后从数组的右端向左端扫描直到找到一个小于它的元素,停止,然后从数组的左端到右端扫描,直到找到一个大于它的元素,停止,然后交换两个元素的位置。当两个指针相遇时,交换基准和相遇位置的元素。

//思路一
public class QuickSort {

    public void quickSort(int[] arr){
        if(arr == null || arr.length < 2)
            return;
        quickSort(arr, 0, arr.length - 1);
    }

    public void quickSort(int[] arr, int L, int R){
        if(L < R){
            swap(arr, L + (int)(Math.random() * (R - L + 1)), R); // 随机选一个数与最后一个数交换
            int[] p = partition(arr, L, R); //把小的放左边,等于放中间,大的放右边
            quickSort(arr, L, p[0] - 1);//排左边
            quickSort(arr, p[1] + 1, R);//排右边
        }
    }

    public int[] partition(int[] arr, int L, int R){
        int less = L - 1;
        int more = R;
        while(L < more){
            if(arr[L] < arr[R])
                swap(arr, ++less, L++);
            else if(arr[L] > arr[R])
                swap(arr, --more, L);
            else
                L++;
        }
        swap(arr, more, R);
        return new int[]{less + 1, more};
    }

    public 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 = {5, 3, 6, 2, 1, 9};
        new QuickSort().quickSort(arr);
        for (int e: arr) {
            System.out.println(e);
        }
    }
}

//思路二
public class quickSort2 {

    public void quickSort(int[] arr){
        if(arr == null || arr.length < 2)
            return;
        quickSort(arr, 0, arr.length - 1);
    }

    public void quickSort(int[] arr, int L, int R){
        if(L < R){
            swap(arr, L + (int)(Math.random() * (R - L + 1)), R);
            int i = partition(arr, L, R);
            quickSort(arr, L, i - 1);
            quickSort(arr, i + 1, R);
        }
    }

    public int partition(int[] arr, int L, int R){
        int index = R;
        R--;
        while(L < R){
            /*
            if(arr[R] > arr[index])
                R--;
            else if(arr[L] < arr[index])
                L++;
            else
                swap(arr, arr[R--], arr[L++]);*/
            while (arr[R] > arr[index])
                R--;
            while(arr[L] < arr[index])
                L++;

            swap(arr, arr[R--], arr[L++]);
        }
        swap(arr, arr[index], arr[L]);
        return L;
    }

    public 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 = {5, 3, 6, 2, 7, 3, 1, 9};
        new QuickSort().quickSort(arr);
        for (int e: arr) {
            System.out.println(e);
        }
    }
}

目录
相关文章
|
3天前
|
人工智能 运维 安全
|
5天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
393 124
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
8天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
741 109
|
2天前
|
算法 Python
【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为(Matlab代码实现)
【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为(Matlab代码实现)
229 152
|
4天前
|
Java 数据库 数据安全/隐私保护
Spring 微服务和多租户:处理多个客户端
本文介绍了如何在 Spring Boot 微服务架构中实现多租户。多租户允许单个应用实例为多个客户提供独立服务,尤其适用于 SaaS 应用。文章探讨了多租户的类型、优势与挑战,并详细说明了如何通过 Spring Boot 的灵活配置实现租户隔离、动态租户管理及数据源路由,同时确保数据安全与系统可扩展性。结合微服务的优势,开发者可以构建高效、可维护的多租户系统。
207 127
|
2天前
|
编解码 算法 自动驾驶
【雷达通信】用于集成传感和通信的OFDM雷达传感算法(Matlab代码实现)
【雷达通信】用于集成传感和通信的OFDM雷达传感算法(Matlab代码实现)
180 125
|
2天前
|
JavaScript 关系型数据库 MySQL
基于python的网上外卖订餐系统
本系统基于Python与Flask框架,结合MySQL数据库及Vue前端技术,实现了一个功能完善的网上订餐平台。系统涵盖餐品、订单、用户及评价管理模块,并深入研究订餐系统的商业模式、用户行为与服务质量。技术上采用HTML、PyCharm开发工具,支持移动端访问,助力餐饮业数字化转型。