快速排序---从大到小和从小到大(Java)

2023-11-08

快速排序:

  快速排序由于排序效率在同为O(nlogn)的几种排序方法中效率较高,因此经常被采用,再加上快速排序使用了分治法的思想,算是基础排序中比较高档的一种排序了。

基本思想

1.先从数列中取出一个数作为基准数,可以是第一个,也可是中间的或者最后的,但是第一步要把这个基准数与数组最后一位对换。
2.将比这个数大(小)的数全放到它的右边,小于或等于(大于或等于)它的数全放到它的左边。
3.对左右区间重复第二步,直到各区间只有一个数(递归定义)。

详细图示

在这里插入图片描述 

图片来源于网络

代码展示

public class Quick {

    public static void main(String[] args) {

        Integer arrA[] = new Integer[] { 13, 1, 2, 43, 65, 23, 76, 77, 23, 11, 99 };
        Integer arrB[] = new Integer[] { 13, 1, 2, 43, 65, 23, 76, 77, 23, 11, 99 };
        Integer[] arr1 = quickSortBig2Small(arrA, 0, arrA.length - 1);
        System.out.println("从大到小:" + Arrays.toString(arr1));
        Integer[] arr2 = quickSortSmall2Big(arrB, 0, arrB.length - 1);
        System.out.println("从小到大:" + Arrays.toString(arr2));

    }

    /**
     * 快排从大到小
     */
    private static Integer[] quickSortBig2Small(Integer[] arr, int low, int high) {

        // 如果开始点和结束点没有重叠的时候,也就是指针没有执行到结尾
        if (low < high) {

            // 重新获取中间点
            int mid = getIndexFromBig2Small(arr, low, high);
            quickSortBig2Small(arr, low, mid - 1);
            quickSortBig2Small(arr, mid + 1, high);
        }
        return arr;
    }

    /**
     * 快排从小到大
     */
    private static Integer[] quickSortSmall2Big(Integer[] arr, int low, int high) {

        // 如果开始点和结束点没有重叠的时候,也就是指针没有执行到结尾
        if (low < high) {

            // 重新获取中间点
            int mid = getIndexFromSmall2Big(arr, low, high);
            quickSortSmall2Big(arr, low, mid - 1);
            quickSortSmall2Big(arr, mid + 1, high);
        }
        return arr;
    }

    /**
     * 交换数组元素
     */
    private static void swap(Integer[] arr, int low, int high) {

        int temp = arr[low];
        arr[low] = arr[high];
        arr[high] = temp;
    }

    /**
     * 获取中间值(从大到小)
     */
    private static int getIndexFromBig2Small(Integer[] arr, int low, int high) {

        // 中值作为中点
        int index = (low + high) / 2;

        int midNum = arr[index];

        // 无论取的值是哪一个,都应该将其放在最后面
        swap(arr, index, high);

        while (low < high) {

            // 左侧值大于或者等于右侧值时候,只需要移动指针即可,不需要交换( 注意 =,没有会陷入死循环)
            while (low < high && arr[low] >= midNum)
                low++;
            swap(arr, low, high);

            // 右侧值小于或者等于右侧值时候,只需要移动指针即可,不需要交换
            while (low < high && arr[high] <= midNum)
                high--;
            swap(arr, low, high);
        }
        return high;
    }

    /**
     * 获取中间值(从小到大)
     */
    private static int getIndexFromSmall2Big(Integer[] arr, int low, int high) {

        // 中值作为中点
        int index = (low + high) / 2;

        int midNum = arr[index];

        // 无论取的值是哪一个,都应该将其放在最后面
        swap(arr, index, high);

        while (low < high) {

            // 左侧值小于或者等于右侧值时候,只需要移动指针即可,不需要交换( 注意 =,没有会陷入死循环)
            while (low < high && arr[low] <= midNum)
                low++;
            swap(arr, low, high);

            // 右侧值小大于于或者等于右侧值时候,只需要移动指针即可,不需要交换
            while (low < high && arr[high] >= midNum)
                high--;
            swap(arr, low, high);
        }
        return high;
    }

}

运行图示

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速排序---从大到小和从小到大(Java) 的相关文章

随机推荐

  • 数据表中常见的数据类型

    数据表中常见的数据类型有 整数类型 浮点数类型 日期与时间类型 字符串类型 二进制类型 布尔类型 整数类型 1int型 表示整型数值 是由四个字节组成的整数 输出范围 2147 2147 数据类型32位 short型 表示短整型 输出范围是
  • 项目_MySQL服务器被入侵,数据丢失,一招教你恢复数据【已恢复】

    已恢复 MySQL服务器被入侵 数据丢失 一招教你恢复数据 0 前言 当时在宝塔安装了MySQL5 7 然后当时只是测试 就直接设置用户名和密码为root 今天在Navicat突然登录不上了 于是在linux下登录MySQL 只剩下一个Re
  • Python进阶-----面向对象1.0(对象和类的介绍、定义)

    目录 前言 面向过程和面向对象 类和对象 Python中类的定义 1 类的定义形式 2 深层剖析类对象 前言 感谢各位的一路陪伴 我学习Python也有一个月了 在这一个月里我收获满满 学到了很多知识 每当我学会了一个新的知识点我会发表一篇
  • 压控恒流源学习笔记

    激光二极管 以下称LD 即使采用恒流驱动 其光输出功率也会随温度变化而发生大的变动 因此必须监视它的光输出 利用反馈环路来控制驱动电流 这即是自动输出控制APC AutomatICPowerControl 电路 第一种 调节激光亮度 可以依
  • Java——ArrayList基本使用

    1 简介 ArrayList是实现List接口的 底层采用数组实现 ArrayList 实现了Cloneable接口 即覆盖了函数clone 能被克隆 ArrayList 实现java io Serializable接口 这意味着Array
  • LRU缓存机制

    LRU缓存机制LeetCode146官方题解 struct DLinkedNode int key value DLinkedNode prev DLinkedNode next DLinkedNode key 0 value 0 prev
  • spring boot 启动报错,找不到DataSource

    报错信息如下 16 39 11 372 1653 main WARN o s b c e AnnotationConfigEmbeddedWebApplicationContext AbstractApplicationContext ja
  • 【C++】-- 哈希算法

    目录 一 哈希概念 1 插入和查找 2 哈希表 3 常见的哈希函数 1 直接定址法 2 除留余数法 二 用闭散列解决哈希冲突 1 线性探测法介绍 2 线性探测的实现 1 状态 2 定义HashData 3 哈希表 4 查找 5 插入 6 删
  • sparkStreaming:实时流数据详解

    目录 一 概述 二 wordCount示例 三 初始化StreamingContext 四 DStreams 离散数据流 五 输入DStream和接收器 Basic sources File Streams Custom Receivers
  • js 实现鼠标点击tab栏选项卡切换,下面相应内容跟随变化

  • Github上 简单易用的 Android ViewModel Retrofit框架

    RequestViewModel 长期更新 支持网络请求的ViewMode框架 ViewModel LiveData Retrofit github 地址 https github com miaotaoii RequestViewMode
  • [980]Windows host配置域名

    程序员开发中可能会需要域名访问程序 说白了就是修改hosts文件 过程如下 1 找到本机hosts文件路径一般位置在 C Windows System32 drivers etc 2 右键编辑hosts文件 在最下面增加 127 0 0 1
  • java的格式化时间工具类

    代码 public class DateTimeUtil private static final Logger logger LoggerFactory getLogger DateTimeUtil class public static
  • 全链路监控之pinpoint

    一 pinpoint出现与其他相似概念比较 1 pinpoint概念 pinpoint是由java PHP编写而成的 用来对大规模的分布式系统提供应用性能管理 pinpoint可以解决复杂架构下的拓扑解析与性能分析 2 pinpoint的特
  • NCNN、OpenVino、 TensorRT、MediaPipe、ONNX,各种推理部署架构,到底哪家强?

    以深度学习为主的人工智能算法模型在日常AI应用中逐渐占据主流方向 相关的各类产品也是层出不穷 我们平时所看到的AI产品 像刷脸支付 智能语音 银行的客服机器人等 都是AI算法的具体落地应用 AI技术在具体落地应用方面 和其他软件技术一样 也
  • 数字图像与视频处理 作业模板 Latex版

    搞了好久 终于把这个简单的模板给拼出来了 不熟悉想做点什么真的太难 做的时候一点点小的问题就可能发去半天的时间都找不出来 比如到最后完全没有问题的时候bibtex命令就是通不过 后来我把文件名改短了 去掉分隔符 成功了 所以说不懂的事情要从
  • 黑窗口下带进度条的http下载

    package main import flag fmt io log net http os strconv strings time github com cheggaaa pb var url flag String url The
  • mac下pycharm使用小技巧--持续更新

    Pycharm使用小技巧 pycharm创建新文件自动添加文件头注释 背景 我们平时在使用pycharm发现有些大神创建一个新文件的时候会自动在文件头添加一些注释 像是有文件路径 创建时间 创建人 集成平台等信息 但是我们自己创建的时候就没
  • 论文翻译:2021_Performance optimizations on deep noise suppression models

    Python微信订餐小程序课程视频 https blog csdn net m0 56069948 article details 122285951 Python实战量化交易理财系统 https blog csdn net m0 5606
  • 快速排序---从大到小和从小到大(Java)

    快速排序 快速排序由于排序效率在同为O nlogn 的几种排序方法中效率较高 因此经常被采用 再加上快速排序使用了分治法的思想 算是基础排序中比较高档的一种排序了 基本思想 1 先从数列中取出一个数作为基准数 可以是第一个 也可是中间的或者