快速排序详解-java实现

2023-05-16

一、快速排序

整体过程
1.先从数组中找一个数作为基准数,
2 进行分区,分区时大于这个数得全部放到右边,小于这个数得全部放到左边,等于这个数得全部放到中间(核心过程)
3再通过递归再更小得范围执行2步骤,直到递归到只有一个数

思路解析
比如针对 3 4 2 1 5 6 0 3
它的一个思路是首先有一个左边区域和右边区域,

左边区域的最靠右的起始下标为-1,右边区域的最靠左的起始下标为length-1

然后以数组最后一个数3为界限,大于这个数的都在右边,小于这个数的都在左边

首先排的时候index 为0,然后判断下标为0的数3 ==3,所以左右边界不动,index继续++
当index为1,判断下标为1的数4 4>3 ,所以右边界往右移动一位到length-2 值为0 将值为0与值为4调换位置 ======> 3 0 2 1 5 6 4 3
然后继续判断index为1 此时值为 0 0<3 所以左边界加1到0,值为3,将3与0调换位置,然后index+1 到2 ======> 0 3 2 1 5 6 4 3

当index为2时,判断下标为2的数 2<3, 所以左边界加1到1, 值为3 将 3与2
调换位置,然后index+1 到3 ======> 0 2 3 1 5 6 4 3
当index为3时,判断下标为3的数 1<3, 所以左边界加1到2 值为3 将3与1调换位置 然后index+1 到4 ======> 0 2 1 3 5 6 4 3

当index为4时,判断下标为4的数 5>3, 所以右边界往右移动一位到length-3 值为6,将值为6与值5调换位置 ======> 0 2 1 3 6 5 4 3
当index为4时,判断下标为4的数 6>3, 所以右边界往后移动一位到length-4----即下标为4,但是此这样就不满足index<右边界 所以跳出来
跳出来后将index为4的值和数组的最后一个值做交换 ===》 0 2 1 3 3 5 4 6
即结束

代码实现

public static void quickSort1(int[] arr) {
    if (arr == null || arr.length < 2) {
        return;
    }
    process(arr, 0, arr.length - 1);
}
public static void process(int[] arr, int L, int R) {
    if (L >= R) {
        return;
    }
    int[] equalE = partition(arr, L, R);
    process(arr, L, equalE[0] - 1);
    process(arr, equalE[1] + 1, R);
}

// arr[L...R]范围上,拿arr[R]做划分值,
// L....R < = >
public static int[] partition(int[] arr, int L, int R) {
    int lessR = L - 1;
    int moreL = R;
    int index = L;
    while (index < moreL) {
        if (arr[index] < arr[R]) {
            lessR++;
            swap(arr, lessR, index);
            index++;
        } else if (arr[index] > arr[R]) {
            moreL--;
            swap(arr, moreL, index);
        } else {
            index++;
        }
    }
    swap(arr, moreL, R);
    //比如342555578 //返回3,6
    return new int[] { lessR + 1, moreL };  
}

public static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

但是我们现在实现的代码整体时间复杂度为O(n^2); ->因为当数据为[0,1,2,3,4,5]==>这种情况时间复杂度是O(N^2)
所以其实是可以进行优化处理的
如何优化呢?即随机选择了一个划分值放到了最右边
整体的代码量比上面多出一行
因为是随机选择得划分值,那么打到任意一个位置,选取作为划分值得权重是一样得
这样一来根据数学推算,最后收敛于O(NlogN)

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

	public static void process3(int[] arr, int L, int R) {
		if (L >= R) {
			return;
		}
		swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
		int[] equalArea = partition(arr, L, R);
		process3(arr, L, equalArea[0] - 1);
		process3(arr, equalArea[1] + 1, R);
	}
// arr[L...R]范围上,拿arr[R]做划分值,
// L....R < = >
public static int[] partition(int[] arr, int L, int R) {
    int lessR = L - 1;
    int moreL = R;
    int index = L;
    while (index < moreL) {
        if (arr[index] < arr[R]) {
            lessR++;
            swap(arr, lessR, index);
            index++;
        } else if (arr[index] > arr[R]) {
            moreL--;
            swap(arr, moreL, index);
        } else {
            index++;
        }
    }
    swap(arr, moreL, R);
    //比如342555578 //返回3,6
    return new int[] { lessR + 1, moreL };  
}

public static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

关键点
把核心过程定义出来,然后左右边界求出来,之后通过递归不断的遍历下去,
就是再更小的范围上求出划分值对应得左右边界

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

快速排序详解-java实现 的相关文章

  • CentOS7 使用RPMBUILD 编译 Openssh rpm包并安装

    若要进行生产环境的操作 xff0c 请务必看完整篇文档 实验环境 xff1a Centos7 4 离线系统 目前已经成功完成了openssh 9 1p1的编译 1 准备openssh源码包 在home目录开始 xff0c 设置工作目录 sp
  • Linus工作室 2021年 PB级存储方案

    来自于加拿大Linux 工作室 本文章仅整理内容 xff0c 另外还有一些本人的理解 实际上这已经是Linux PB计划第二代了 xff0c 比第一代更加NB 原视频地址 xff1a https www bilibili com video
  • 搭建本地yum repo

    在一些离线环境中无法使用在线的yum repo xff0c 只能使用本地的yum仓库 搭建的方式有如下几种 xff1a 使用本地meida使用本地media搭建远程服务器自建repo mirror xff08 施工中 xff09 1 使用本
  • Linux 系统安全加固篇之安全加固脚本

    该专栏内的脚本都会定期更新 xff0c 请注意变化 脚本适用于Centos 7 x系列 xff0c 同样支持Redhat 7 x系列 使用之前建议通读脚本注释 xff0c 并确认不会影响你现在在用的业务 注意脚本内部包含一定的参数 xff0
  • Docker导出正在使用中的镜像

    Docker 导出正在使用中的容器镜像 span class token comment xff01 bin sh span span class token assign left variable IMAGE DIR span span
  • Windows 10 数据恢复与预防数据丢失指南

    Windows 数据恢复与预防数据丢失指南 这个思路适合所有的windows版本 xff0c 但是有些数据恢复软件只能兼容新版系统 xff0c 这些不在我们的讨论范围内 如果你在使用电脑时不慎删除了一个重要的文件 xff0c 那么你可以在你
  • Flask SqlAlchemy Postgres 场景下如何使用右连接(Right Join)

    在Sqlalchemy中只有左连接 xff0c 而没有设计右连接 虽然说左右连接可以相互转换 xff0c 但是有些特定的场景下还是没有办法交换位置 所以我们选择了替代方案 xff0c 使用SqlAlchemy的全连接 FULL JOIN F
  • Nexus 3 清理docker镜像

    该文章提供了一种清理nexus3中存储的docker镜像的一种新思路 查看docker repo 比如你的docker repo名字叫做test repo xff0c 然后在nexus3首页的seatch下面找到docker xff0c 点
  • CentOS 7通过RPMbuild方式离线安装Openssl

    对于Centos7 最大兼容版本为1 1 1x 这里的x指代最新的版本标签 截止到文档编写时 最新的版本号为1 1 1t 编译流程 安装编译工具 yum y span class token function install span sp
  • vmware CentOS7图形界面与命令行界面切换

    在图形界面使用 ctrl 43 alt 43 F2切换到dos界面 dos界面 ctrl 43 alt 43 F2切换回图形界面 在命令上 输入 init 3 命令 切换到dos界面 输入 init 5命令 切换到图形界面 如果想系统默认以
  • AI Stable Diffusion Prompt参数【一】

    AI Stable Diffusion Prompt参数 一 配置场景1 草丛里的女性promptNegative Prompt结果 场景2 雨中披头散发的女孩promptNegative Prompt结果 场景3 一个女孩和她的朋友在逛街
  • Android Studio配置优化最全详解

    适合第一次安装AS的新手 xff0c 感谢网上的资源 是不是很多同学已经有烦恼出现了 xff1f 电脑配置已经很高了 xff0c 但是每次运行Android程序的时候就很卡 xff0c 而且每次安装运行程序都要等待很长时间 xff0c 如果
  • 解决Centos firewalld导致的docker容器内无法访问外网,无法访问其他容器(host没办法解析)

    开启 NAT 转发 firewall cmd permanent zone 61 public add masquerade 检查是否允许 NAT 转发 firewall cmd query masquerade 禁止防火墙 NAT 转发
  • 在JVM中多个应用程序共享jvm内存吗

    每运行一次main 函数 xff0c 就生成一个jvm内存模型实例 xff0c 他们互不相干 xff0c 互不干扰 xff0c 不共享内存和数据 验证方法 xff1a 本地创建两个带main方法的测试类 xff0c 在程序中打断点 xff0
  • java HttpURLConnection 下载网络图片 图片损坏

    对于使用java net 包下的 HttpURLConnection获取图片流 下载图片 xff0c 个别图片打开显示图片损坏的 xff0c 可以使用 HttpClients工具类试试 代码如下 import org apache http
  • Ubuntu 安装与使用UFW防火墙 | ufw与iptables

    iptables 是一个通过控制 Linux 内核的 netfilter 模块来管理网络数据包的流动与转送的应用软件 xff0c 其功能包括不仅仅包括防火墙的控制出入流量 xff0c 还有端口转发等等 iptables 内部有表 table
  • 《计算机网络基础》笔记------ 计算机网络概述(一)

    目录 1 计算机网络的基本概念 1 1 计算机网络的定义 所谓计算机网络就是利用通信设备和线路将地理位置不同 功能独立的多个计算机系统互连起来 xff0c 并通过功能完善的网络软件实现网络中资源共享和信息传递的系统 定义中的要点 xff1a
  • MATLAB Win10分辨率低的蜜汁改进方法

    蜜汁耦合 xff0c 不喜勿喷 我的matlab2014用在win10系统里分辨率始终非常模糊 xff0c 不知道该怎么调节 直到昨晚 xff0c 我在一个变量上单击鼠标右键 xff0c 只见matlab一闪 xff0c 突然变成的小而清晰
  • Ubuntu一直卡在登录界面的解决办法

    遇到这个问题 xff0c 我尝试卸载NVIDIA驱动后 xff0c 重启后 xff0c 成功进入系统 因此判断 xff0c 是NVIDIA驱动导致的 每个人系统配置和情况有所不同 xff0c 仅供参考 我的电脑配置 xff1a Window
  • 记Mybatis的坑,解决Error attempting to get column ‘name‘ from result set,Cannot determine value type from

    首先上报错 xff1a org springframework dao DataIntegrityViolationException Error attempting to get column name from result set

随机推荐

  • ffmpeg的基本用法

    title ffmpeg的基本用法 categories ffmpeg tags 音视频编程 date 2021 11 18 作者 xff1a hackett 微信公众号 xff1a 加班猿 一 ffmpeg的安装 1 Centos安装 F
  • Mac 安装Charles抓包工具及使用教程(什么,都什么时候了还不会抓包)

    Mac 安装Charles抓包工具及使用教程 一 抓包工具对比二 安装Charles三 网页抓包 一 抓包工具对比 这五个工具都是比较常用的抓包工具 xff0c 具体哪个更适合你需要根据你的具体需求和使用习惯来决定 以下是它们各自的优缺点
  • Python 队列Queue和PriorityQueue

    1 Python的Queue模块 xff1a 适用于多线程编程的FIFO实现 它可用于在生产者 producer 和消费者 consumer 之间线程安全 thread safe 地传递消息或其它数据 xff0c 因此多个线程可以共用同一个
  • XGBoost之类别特征的处理

    目录 Label encoding与 One Hot encoding Label encoding one hot encoding 利用神经网络的Embedding层处理类别特征 Embedding简介 Network Embeddin
  • window10系统英伟达NVIDIA显卡驱动和CUDA软件的安装和升级

    目录 一 如何查看电脑是否支持CUDA及支持的CUDA版本 二 如何知道我的显卡是否支持CUDA加速 三 查看显卡是否支持CUDA及支持的版本 四 英伟达NVIDIA显卡驱动下载与安装和升级 如下方案亲测试可用 一 如何查看电脑是否支持CU
  • Pytorch替换model对象任意层的方法

    Pytorch替换model对象任意层的方法 知乎 直接上代码 import torch from torch import nn from torchvision models import alexnet 核心函数 xff0c 参考了t
  • Keras打印tensor的值以及学习率

    keras 打印 tensor 的值 小又欠的博客 CSDN博客 keras查看tensor的值 keras 打印 tensor 的值在调试时 xff0c 此问题困扰我许久网上大多都是 sess run xff0c 且也是 tensorfl
  • 一种基于目标检测实现黑花屏分类任务的方案

    转载 xff1a 一种基于目标检测实现黑花屏分类任务的方案 视频花屏检测 叶赫那拉 赫敏的博客 CSDN博客 然而 xff0c 在项目过程中 xff0c 视频帧数据的收集比较困难 xff0c 数据量较少 xff0c 部分花屏和正常屏之间差异
  • 开源工业缺陷数据集汇总,持续更新中(已更新28个)

    转载 xff1a 开源工业缺陷数据集汇总 xff0c 持续更新中 xff08 已更新28个 xff09 知乎 欢迎大家关注我的公众号 xff1a 一刻AI 本文目前汇总了常见的28个开源工业缺陷数据集 xff0c 持续更新中 xff08 欢
  • 带你了解ICCV、ECCV、CVPR三大国际会议

    文章目录 前言 一 ICCV ECCV CVPR是什么 1 ICCV 2 ECCV 3 CVPR 二 三大会链接及论文下载链接 前言 作为刚入门CV的新人 有必要记住计算机视觉方面的三大顶级会议 ICCV CVPR ECCV 统称为ICE
  • 深度学习之卷积神经网络CNN详解

    TensorFlow 卷积层 池化层详解 叠加态的猫 博客园 两种网络层实现的数学细节 https www cnblogs com hellcat p 7850048 html 一 CNN概述 CNN一个牛逼的地方就在于通过感受野和权值共享
  • 深度学习之卷积神经网络CNN 常用的几个模型

    LeNet5 论文 xff1a http yann lecun com exdb publis pdf lecun 01a pdf LeNet 5 xff1a 是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络 xff0
  • AI Stable Diffusion Prompt参数【二】之 生成效果查验

    AI Stable Diffusion Prompt参数 二 之 生成效果查验 效果国漫风生成参数配置prompt xff1a Negative prompt Model Steps Sampler CFG scale Clip skip
  • batch norm、relu、dropout 等的相对顺序和BN、dropout的几个问题和思考

    总结 xff1a BN和dropout一般不同时使用 xff0c 如果一定要同时使用 xff0c 可以将dropout放置于BN后面 1 batch norm relu dropout 等的相对顺序 Ordering of batch no
  • 推荐系统之ESMM算法精读和实战

    目录 一 背景 二 ESMM模型 2 1 ESMM 模型结构 2 2 ESMM模型特点 2 3 ESMM模型适用场景 三 实验效果 lt
  • 远程桌面连接 提示用户名密码错误的解决办法

    提示 用户名或者密码错误 xff0c 有两种可能 xff1a 1是 用户名 密码可能输入错误 2是 可能你这个用户名暂不支持远程访问 首先解决用户名 密码的问题 xff1a 计算机的命名规则为 计算机 43 账户 的形式 如果您的账户不是A
  • 金融时间序列模型整理

    GARCH模型 https www math pku edu cn teachers lidf course fts ftsnotes html ftsnotes fts garch html 金融时间序列入门 完结篇 ARCH GARCH
  • 工具学习——ubuntu轻量桌面对比

    因为最近要做一些ubuntu上的开发 xff0c 然后使用ssh问题是经常会出现中断 xff0c 虽然可以使用等tmux方法来挂起进程 xff0c 但是感觉不如界面方便 xff0c 然后现在问题来了 xff0c 我的ubuntu服务器是一个
  • JPA自定义VO接受返回结果集(unwrap)

    JPA跟mybitis比较 xff0c 简单的业务搜索是方便的 xff0c 但是设计到复杂的SQL搜索时 xff0c 我们需要自定义SQL 1 64 Query直接写SQL 缺点是无法动态的组装条件 2 JPA的Specification对
  • 快速排序详解-java实现

    一 快速排序 整体过程 xff1a 1 先从数组中找一个数作为基准数 xff0c 2 进行分区 xff0c 分区时大于这个数得全部放到右边 xff0c 小于这个数得全部放到左边 xff0c 等于这个数得全部放到中间 xff08 核心过程 x