五、java代码实现快速排序

2023-10-29

快速排序思路

  • ①、每一轮排序选择一个基准点进行分区
    让小于基准点的元素进入一个分区,大于基准点的元素进入另一个分区
    当分区完成时,基准点元素的位置就是其最终的位置

  • ②、在子分区内重复以上过程,直至子分区元素个数少于等于1(分治算法)

代码实现(单边循环快排)

  • ①、选择最右边元素作为基准点元素
  • ②、j指针负责找到比基准点小的元素,一旦找到则与i进行交换
  • ③、i指针维护小于基准点元素的边界,也是每次交换的目标索引
  • ④、最后基准点与i交换,i即为分区位置
import java.util.Arrays;

public class Testjava2 {
    public static void main(String[] args) {
        int[] a = {5, 1, 3, 2, 4, 9, 8, 7, 0};
        quick(a, 0, a.length - 1);
    }

    public static void quick(int[] a, int l, int h) {
        if (h <= l) {
            // 当分区只有一个元素的时候 说明已经有序 结束递归
            return;
        }
        int p = partition(a, l, h); // 基准点索引值
        quick(a, l, p - 1); // 左边分区 范围确定
        quick(a, p + 1, h); // 右边分区 范围确定
    }

    /**
     * @param a 待排序数组
     * @param l 左边界
     * @param h 基准点
     * @return 基准点元素所在的正确索引,用它确定下一轮分区的边界
     */
    public static int partition(int a[], int l, int h) {
        int pv = a[h]; // 基准点元素
        int i = l;  // 基准点元素所在的正确索引
        for (int j = l; j < h; j++) {
            if (a[j] < pv) {
                if (i != j) {
                    swap(a, i, j);
                }
                i++;
            }
        }
        // 交换基准点元素
        if (i != h) {
            swap(a, h, i);
        }
        System.out.println(Arrays.toString(a) + "  " + i);
        return i;
    }

    // 交换元素方法
    public static void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

代码实现(双边循环快排)

  • ①、选择最左边元素作为基准点元素
  • ②、j指针负责从右向左找比基准点小的元素,i指针负责从左往右找比基准点大的元素,一旦找到则交换,直至i,j相交
  • ③、最后基准点与i(此时i与j相等)交换,i即为分区位置
import java.util.Arrays;

public class Testjava3 {
    public static void main(String[] args) {
        int[] a = {5, 1, 3, 2, 4, 9, 8, 7, 0};
        quick(a, 0, a.length - 1);
    }

    public static void quick(int[] a, int l, int h) {
        if (h <= l) {
            // 当分区只有一个元素的时候 说明已经有序 结束递归
            return;
        }
        int p = partition(a, l, h); // 基准点索引值
        quick(a, l, p - 1); // 左边分区 范围确定
        quick(a, p + 1, h); // 右边分区 范围确定
    }

    /**
     * 双边循环
     *
     * @param a 待排序数组
     * @param l 左边界
     * @param h 基准点
     * @return 基准点元素所在的正确索引,用它确定下一轮分区的边界
     */
    public static int partition(int a[], int l, int h) {
        int pv = a[l]; // 基准点元素
        int i = l;  // 基准点元素所在的正确索引
        int j = h;
        while (i < j) {
        	// 必须先从右往左找 再从左往右找
            // j从右找比基准点小的元素
            while (i < j && a[j] > pv) {
                j--;
            }
            // i从左找比基准点大的元素
            while (i < j && a[i] <= pv) {
                i++;
            }
            swap(a, i, j);
        }
        // 交换基准点元素
        swap(a, l, j);
        System.out.println(Arrays.toString(a) + " " + j);
        return j;
    }

    // 交换元素方法
    public static void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

}

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

五、java代码实现快速排序 的相关文章

随机推荐

  • BurpSuite数据包的导出及导入

    说明 在使用BurpSuite时难免会出现中途要关闭burp可是需要保存当前的数据包记录 或者想要将当前的数据包记录分享给他人 那么就需要用到BurpSuite的导出和导入功能了 导出 这是我们浏览的数据包 现在将这些记录进行导出 点击Pr
  • K8S集群+负载均衡层+防火墙 实例

    实验拓扑图 实验要求 1 Kubernetes 区域可采用 Kubeadm 方式进行安装 2 要求在 Kubernetes 环境中 通过yaml文件的方式 创建2个Nginx Pod分别放置在两个不同的节点上 Pod使用hostPath类型
  • 详解#program

    C和C 的每个实现对它的主机或操作系统都支持一些独有的特征 例如 某些程序须对存放数据的存储器区域进行精确的控制 或必须控制特定函数接受参量的方式 pragma指令对每个编译器给出了一个方法 在保持与C和C 语言完全兼容的情况下 给出主机或
  • CSS——position属性

    absolute 生成绝对定位的元素 相对于 static 定位以外的第一个父元素进行定位 元素的位置通过 left top right 以及 bottom 属性进行规定 父元素必须有relative absolute才可以 fixed 生
  • 用数据告诉你出租车资源配置是否合理

    互联网 下不同时空如何建立合适的指标分析出租车 供求匹配 的程度 由于出租车供求匹配 以及一系列的补贴方案涉及到可行性的问题 我们采用出租车轨迹数据做出相应的解答 出租车上下客高峰期 查看不同城市的出租车上下客高峰期的时间段 从深圳市的上下
  • 【每日一题】最大利润 -python

    题目描述 商人经营一家店铺 有number种商品 由于仓库限制每件商品的最大持有数量是item index 每种商品价格是item price item index day 通过对商品的买进和卖出获取利润 请给出商人在days天内能获取的最
  • 性能测试指标(一)

    介绍性能测试的教程和文章比较多 总结性能测试的指标为多 快 好 省 多 并发数量 快 延时 响应时间 好 长时间运行 省 资源使用率 在介绍吞吐量直接先从几个大家熟知的概念说起 1 响应时间 响应时间为各个时间段往返时间之和 包括 用户客户
  • 打卡:4.9 C语言篇 -(1)初识C语言 - (5)字符串-转义字符-注释

    C语言篇 1 初识C语言 5 字符串 转义字符 注释 简介 纠正 字符串 转义字符 注释 简介 大家好 我是小奔 每天一笔记 从最基础开始写 展现我自己学习过程 如果感觉不错 就点一下关注啦 纠正 字符串 这一篇博客我们来了解一下字符串 看
  • PhalApi+Gearman,接口MQ异步队列任务的完整开发教程

    MQ异步队列 在API接口同步请求过程中 不适合处理耗时过长 或者一直轮询的工作 此时 可以结合MQ异步队列任务进行后台处理 MQ异步队列服务 Gearman 关于异步队列服务有很多种 这里PhalApi选择使用了Gearman 它的特点是
  • js判断数组中重复元素并找出_JavaScript检查数据中是否存在相同的元素(两种方法)...

    这里是两个用于数组中查找重复元素的demo 可以看看啦Title 获取 方法一 var arr1 11 22 33 44 var arr new Array arr1 Array prototype in array function e
  • 分治法

    简介 对于一个规模为n的问题 若该问题可以容易地解决 比如说规模n较小 则直接解决 否则将其分解为k个规模较小的子问题 这些子问题互相独立且与原问题形式相同 递归地解这些子问题 然后将各子问题的解合并得到原问题的解 这种算法设计策略叫做分治
  • nginx访问静态文件不下载

    1 什么是MIME TYPE MIME Multipurpose Internet Mail Extension 多用途因特网邮件扩展 最初是为了满足电子邮件支持多字符集及附件而出现的 MIME Type 不是个人指定的 是经过 ietf
  • oracle exec报错,VNCSERVER 重启后突然报错:ExecStart=usrbinvncserver_wrapper oracle %i (code=exited, status=2)...

    VNCSERVER 重启后突然报错 ExecStart usr bin vncserver wrapper oracle i code exited status 2 root ykt systemctl restart vncserver
  • 深入学习jquery源码之map()

    概述 将一组元素转换成其他数组 不论是否是元素数组 你可以用这个函数来建立一个列表 不论是值 属性还是CSS样式 或者其他特别形式 这都可以用 map 来方便的建立 参数 callback 给每个元素执行的函数 把form中的每个input
  • C++累加求和 (阶乘)

    include
  • open3d学习教程2--点云1

    目录 1 open3d介绍 2 点云 2 1 读取 可视化点云 2 2点云体素下采样 2 3点法线估计 2 4点云着色 1 open3d介绍 接着上一节点云pointcloud open3d是一个开源库 支持快速处理3d数据 比如点云 体素
  • Mysql文件导出数据库,以及Linux中导入数据库

    1 导出命令mysqldump u root p test gt test sql 2 上传到linux服务器上 3 导入数据库文件 4 进入linux中的mysql 5 创建数据库ssm 6 source sql文件的路径名称 7 打包s
  • 最小二乘法构建线性回归方程

    目录 一 相关数学知识的定义 1 1 一元线性回归的定义 1 2 相关系数R 的定义 二 使用jupyter来做一元线性回归分析 2 1 根据最小二乘法公式手动构建一元线性回归模型 2 2 调用包实现一元线性回归模型 三 用excel进行一
  • Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

    Three js实例详解 旋转的精灵女孩 附完整代码和资源 一 本文目录 一 旋转的精灵女孩 案例运行效果 二 Three js简介 三 Three js代码正常运行显示条件 1 不载入任何纹理贴图的网页 2 从外部文件里载入几何体或是纹理
  • 五、java代码实现快速排序

    快速排序思路 每一轮排序选择一个基准点进行分区 让小于基准点的元素进入一个分区 大于基准点的元素进入另一个分区 当分区完成时 基准点元素的位置就是其最终的位置 在子分区内重复以上过程 直至子分区元素个数少于等于1 分治算法 代码实现 单边循