首页 > 其他分享 >快速排序实现

快速排序实现

时间:2022-10-27 20:00:57浏览次数:54  
标签:arr right end start 实现 int 排序 快速 left

import java.util.HashMap;

public class Solution {
    public static void main(String[] args) {
        quickSort(new int[]{19, 97, 9, 17, 1, 8});
    }

    public static void quickSort(int[] arr) {
        quickSort(arr, 0, arr.length - 1);
    }

    public static void quickSort(int[] arr, int start, int end) {
        // 如果区域内的数字少于 2 个,退出递归
        if (start >= end) return;
        // 将数组分区,并获得中间值的下标
        int middle = partition(arr, start, end);
        // 对左边区域快速排序
        quickSort(arr, start, middle - 1);
        // 对右边区域快速排序
        quickSort(arr, middle + 1, end);
    }

    // 将 arr 从 start 到 end 分区,左边区域比基数小,右边区域比基数大,然后返回中间值的下标
    public static int partition(int[] arr, int start, int end) {
        // 取第一个数为基数
        int pivot = arr[start];
        // 从第二个数开始分区
        int left = start + 1;
        // 右边界
        int right = end;
        while (left < right) {
            // 找到第一个大于基数的位置
            while (left < right && arr[left] <= pivot) left++;
            // 找到第一个小于基数的位置
            while (left < right && arr[right] >= pivot) right--;
            // 交换这两个数,使得左边分区都小于或等于基数,右边分区大于或等于基数
            if (left < right) {
                exchange(arr, left, right);
                left++;
                right--;
            }
        }
        // 如果 left 和 right 相等,单独比较 arr[right] 和 pivot
        //例如交换一次之后,往后的arr[left]都小于pivot,left一直自增知道等于right,但是此时的right处的元素还没有比较过
        if (left == right && arr[right] > pivot) right--;
        // 将基数和轴交换
        exchange(arr, start, right);
        return right;
    }

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

  

标签:arr,right,end,start,实现,int,排序,快速,left
From: https://www.cnblogs.com/luzhengqin/p/16833535.html

相关文章

  • python实现全自动安装第三方库,从此跟pip说拜拜!!「建议收藏」
    前言嗨喽,大家好呀~这里是爱看美女的茜茜呐又到了学Python时刻~今天再分享一个骚操作:Python自动安装第三方库,全自动不需要你动!再也不怕在自己安装得时候不得要领,报错了......
  • 2019软工期中考试初版实现
    第七次全国人口普查登记(20分)1、项目需求:开展第七次全国人口普查,将为编制“十四五”规划提供重要信息支持;推动实现人口与经济社会、资源环境协调发展,为深化供给侧结构性改......
  • docker如何实现隔离(chrono《kubernetes入门实战课》笔记整理)
    linux操作内核中,为资源隔离提供了三种技术:namespace、cgroup、chroot。容器就是操作系统里一个特殊的“沙盒”环境,与外部系统隔离。隔离是为了系统安全考虑。namespace:可......
  • UE4 C++实现第三人称角色基本功能
    首先基于Character创建一个角色类,在头文件为其添加弹簧臂和摄像机组件UPROPERTY(VisibleAnywhere,Category="Comp")classUCameraComponent*CameraComp......
  • 外贸人如何快速学好英语
    对于一个外贸人来说,英语基础知识是必不可少的,英语在外贸中的作用不言而喻。但是,有些销售人员把英语不好作为不接单的最重要原因,这显然是不正确的。英语虽然重要,但不是核心内......
  • PostgreSQL 实现给查询列表增加序号操作
    这篇文章主要介绍了PostgreSQL实现给查询列表增加序号操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。利用ROW_NUMBER()over()给查询序列增加......
  • 万物皆可集成系列:低代码对接阿里物流API实现快递跟踪
    随着各大电商网购平台的发展,快递业已形成一个规模庞大的产业,据统计,全球快递企业已超过千家,而快递查询对于电商平台而言是最基础的功能之一,通过输入快递单号,不用区分具体是哪......
  • js-webuploader+js如何实现分片+断点续传
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。首先我们需要了解的是上传文件三要素:1.表单提交方式......
  • List数组使用stream根据时间进行排序实现
    乱序[Student{userName='张三',userNick='2',age=22,createTime='2022-12-022:11:00'},Student{userName='李四',userNick='1',age=23,createTime='2022-12-03......
  • C++对象模型:g++实现(二)
    上一篇博客《C++对象模型:g++实现(一)》用我的理解总结了在无继承体系下g++实现的C++对象的内存布局,这篇就来总结一下在有继承情况下的C++对象的内存布局。有继承情况下的C++......