[数据结构与算法] 快速排序-三向切分方式 JAVA 代码实现

news/2024/5/20 0:36:08 标签: 算法, 数据结构, java, 快速排序

目录

1. 快速排序

2. 三向切分快速排序 - Java 实现

3. 标准快排与三向切分快排效率对比

4. 总结


1. 快速排序

标准快速排序动画及 JAVA 代码实现 [点我查看]

2. 三向切分快速排序 - Java 实现

java">    /**
     * 快速排序三向切分
     *
     * @param nums 待排序数组
     */
    public void quickSortThreeWay(int[] nums) {

        sortThreeWay(nums, 0, nums.length - 1);
    } 

    /**
     * 三向切分
     *
     * @param nums 排序数组
     * @param lo 当前排序区间,左节点下标
     * @param hi 当前排序区间,右节点下标
     */
    public void sortThreeWay(int[] nums, int lo, int hi) {

        // 退出条件
        if (lo >= hi) {
            return;
        }

        // nums[left] 作为分区值
        int left = lo;
        int right = hi;
        int mid = left + 1;

        /* 处理结果
         * [lo ~ left-1] 小于分区值
         * [left ~ right] 等于分区值
         * [right+1 ~ hi] 大于分区值
         */
        while (mid <= right) {

            if (nums[mid] > nums[left]) {
                swap(nums, mid, right);
                right--;
            } else if (nums[mid] < nums[left]) {
                swap(nums, mid, left);
                mid++;
                left++;
            } else {
                mid++;
            }

        }

        // 对小于当前分区值的区间排序
        sortThreeWay(nums, lo, left - 1);
        // 对大于当前分区值的区间排序
        sortThreeWay(nums, right + 1, hi);
    }

 

3. 标准快排与三向切分快排效率对比

排序效率对比(测试数据量 500万)
排序数值范围标准快速排序三向切分快速排序
0-50011.4390.313
0-50002.5340.592
0-500000.7050.626
0-5000000.6700.893
0-50000000.7011.145
0-500000000.6981.111
排序效率对比(测试数据量 50000 无重复数据)
排序数值范围标准快速排序三向切分快速排序
0-50000 顺序0.5080.041
0-50000 逆序0.5934.702

数据为随机生成,标准快排、三向切分快排,在同数据范围下的原始排序数组数据分布情况一致。

排序时间因不同设备不同数据情况会有不同,仅供参考

4. 总结

三向切分快排,区分了大于分区值小于分区值等于分区值三个区间。等于分区值的区间不参与后续排序,避免了重复数据之间的排序。

  • 重复元素越多,三向切分快排效率越高。
  • 数据越有序,三向切分快排效率越高。

 


http://www.niftyadmin.cn/n/1374153.html

相关文章

今天噪音好大,烦闷!

如今&#xff0c;问题虽然已经有了初步的眉目&#xff0c;但是仍然不容乐观&#xff0c; 1&#xff0c;自适应 2&#xff0c;其他改进 3&#xff0c;用于组合优化&#xff0c;函数优化已经没有问题&#xff08;一个参数或者两个参数&#xff09; 4&#xff0c;用于我的工程…

每天备份tomcat日志

#!/bin/bash Backup_Home/data/backup-log mkdir -p $Backup_Home Log_Home/data/Tomcat/logs App_Log_Home/data/app/tomcat/log Datedate -d yesterday %Y-%m-%d #将昨天tomcat日志mv到备份目录 /usr/bin/mv $Log_Home/catalina.$Date.log $Backup_Home /usr/bin/mv $Log_Hom…

IPv4 地址分类及地址段划分规则

目录前言IP 地址分类A类地址B 类地址C 类地址上述 IP 分类的局限性VLSM vs CIDR划分方式示例示例1&#xff1a;子网掩码示例2&#xff1a;合并网段示例3&#xff1a;划分子网总结前言 IP 地址包括两部分&#xff1a;网络 ID&#xff08;网络地址&#xff09; 主机 ID&#xf…

Java LinkedList 用作 栈、队列、双端队列 的各类操作

目录 LinkedList 数据存储的基础结构 单 Node 信息图示 LinkedList 数据存储关系图示 LinkedList 作为栈使用 push(E)&#xff1a;入栈操作&#xff0c;在头部添加元素 pop()&#xff1a;出栈操作&#xff0c;取出头部元素并将其从栈中移除 peek()&#xff1a;查看头部…

移动安全隐患

1、原本打算回来要看书的&#xff0c;这会又睡不着&#xff0c;索性坐在床上写点什么&#xff0c;一般技术不怎么样的会半夜醒来来鼓捣一会&#xff0c;由于电脑在自习室放着&#xff0c;所以就拿手机来码字啦。 首先说说我之前看的某博主分享的Android数据库导出工具ADEL&…

Delphi中高级DLL的编写和调用

Delphi中高级DLL的编写和调用&#xff08;苏涌&#xff09;根据Delphi提供的有关 DLL编写和调用的帮助信息&#xff0c;你可以很快完成一般的 DLL编写和调用的 应用程序。本文介绍的主题是如何编写和调用能够传递各种参数&#xff08;包括对象实例&#xff09;的 DLL。例如&…

Redis 慢查询日志命令 「SLOWLOG」

目录 Redis 慢查询日志概述 慢查询日志的两个配置项 读取慢日志记录 日志输出格式 查询慢日志记录长度 重置慢日志 SLOWLOG 是用来读取和重置 Redis 慢查询日志的命令&#xff0c;Redis 2.2.12 版本开始支持 Redis 慢查询日志概述 客户端从发送命令到获取返回结果经过了…

搭建服务端

1、安装Homebrow Homebrew简称brew&#xff0c;是Mac OSX上的软件包管理工具&#xff0c;能在Mac中方便的安装软件或者卸载软件&#xff0c;可以说Homebrew就是mac下的apt-get、yum神器 /usr/bin/ruby -e "$(curl -fsSL raw.githubusercontent.com/Homebrew/in…)" 如…