java 快排算法详解,java 快排代码

news2025/3/11 9:28:07

 

快排是一种高效的数据结构,它使用一个关键字(Key)来表示数据元素的一个集合。也就是说,快排是一个有序数组,而这个有序数组由两个元素组成。 快排的基本思想是:如果数组元素的值比它前面的两个元素都大,则它们被排在一起,如果小于这个数组的元素值,则它们被排在一起。例如:a+b=c这句话中,a就是一个关键字“a”,b就是一个关键字“b”,c就是一个关键字“c”。 快排和其他数据结构相比的特点主要有以下几点: 1、快排不需要额外存储空间; 2、快排算法是线性的,而且空间复杂度为O (1); 3、快排比较适合于数据量较小的场景下使用; 5、快排不适合用于插入和删除操作。 下面就介绍一下快排的一些概念: 1、快排数组是有序数组,即:元素的值小于或者等于其前面两个元素值之和; 2、当数组元素大于等于两个元素时,快排数组就被称为空数组;

  • 1、快排简介

    快排是一种线性排序,也就是说,快排是按照关键字(key)进行排序的,即:当数组中的关键字小于数组中的元素时,我们就将数组中的关键字加到这个数组的前面;当关键字大于数组中的元素时,我们就将数组中的关键字减到后面。 在 Java语言中,快排是以关键字(Key)为基准对数组进行排序的,在 Java语言中,可以使用java.lang.re cv ()函数来进行操作。但是需要注意的是,在 Java中使用关键字(Key)来进行排序是一种非常简单的方式,因为关键字是我们自己定义的,它只是一个对象。 在 Java语言中有许多内置类来实现快排算法。这些类中有些是以关键字作为参数使用的,比如:dependency_count ()、dependency_parent ()和dependency_region ()。有些是以关键字作为参数使用的,比如: next、 list和 table。 下面介绍几种常见的内置快排算法。

  • 2、快排的时间复杂度

    在 Java中,快排的时间复杂度是O (1),但是在其它编程语言中,快排的时间复杂度可能会更高一些。具体来说,不同语言对快排的时间复杂度的定义可能会有所不同。例如, Python和 Java对于快排时间复杂度的定义可能是不一样的。 在 Java中,快排的时间复杂度是O (1),而在 Python中则是O (logN)。对于不同语言,快排的时间复杂度可能会有所不同,这是因为不同语言在处理数据结构时使用了不同的算法。例如,对于 Python来说,当数组中元素个数小于等于2时,就需要将它们放入空数组中;而对于 Java来说,当数组中元素个数大于2时,就需要将它们放入空数组中。 与之相比,在不同语言中使用了不同的算法来处理数据结构时,快排所需要做的操作也不一样。那么对于不同语言来说,快排的时间复杂度是一样的吗?答案是不一定。例如在 Python中使用了递归算法来处理数组元素个数大于等于2时所做的操作;而在 Java中则使用了循环算法来处理数组元素个数大于等于2时所做的操作。

  • 3、快排数组大小计算公式

    上面的公式是快排大小计算公式,但是在实际应用中,快排并不是按这个公式来计算的,因为如果按照这个公式来计算,那么在判断数组是否小于或者等于两个元素时,我们要先判断一个数组的元素是否大于或者等于两个元素,然后再判断数组元素是否小于或者等于两个元素。 但是在实际应用中,我们往往会忽略一个问题,就是我们不能仅凭一个简单的计算公式来判断数组的大小。在下面的例子中,如果我们输入a和b两个关键字,计算结果是2个关键字之和,那么我们就认为这两个关键字是大于的。但是实际上并非如此,因为我们还有一个判断条件:如果a大于b小于1。所以我们认为这两个关键字是小于的。而快排中的判断条件就是:a+b<1。 所以当我们输入a和b两个关键字时,计算结果就变成了a+b<1和a+b>2。 上面这个例子就是一个简单的快排问题,但是如果把输入范围扩展到三个关键字时,那么就会出现问题了。 比如这样一个例子: 这是一个快排问题的简化版:输入a和b后,计算结果是1和2。因为输入a大于等于2和a小于等于1这两个关键字时,我们认为这个数组就是大于的。但是实际上并非如此,因为快排计算结果不一定就是大于1和小于1这两个关键字之和。当输入a大于2和b时,计算结果是2+3<2+4<2+5=6-5>2+6=7-5;当输入b大于2和c时,计算结果是3-3=4-3>2+3

  • 4、快排的插入与删除操作

    快排的插入与删除操作和数组的元素个数有关。数组中的元素个数大于或小于两个时,则插入操作发生,否则删除操作发生。插入操作是指在数组中先插入一个新的关键字,然后删除原来数组中的一个关键字,再将新插入的关键字和原来数组中的一个关键字合并为新数组的过程。 我们在 Java中可以使用两种方法来实现快排的插入与删除操作。 第一种方法是:当数据量不大时,我们可以使用双指针实现快排插入与删除操作,其中一个指针指向新插入的关键字,另一个指针指向旧插入的关键字。单链表是一种特殊的链表,它能够保证数据在链表中以固定顺序有序存储。 由于快排是线性结构,因此可以使用二分查找来实现快排插入与删除操作。 二分查找是指在给定时间内返回指定大小(n)个元素所占用空间(n)个元素的查找方法。例如:给定一个时间长度为T=2,我们可以使用二分查找来找到T在2-T之间所有可能位置上的值。

  • 5、快排算法的优缺点

    快排算法的优点: 1、快排算法是一种线性的数据结构,只需要O (1)个运算即可完成。对于中等大小的数据,快排比其他数据结构要快; 比如,你有一个100人的班级,你想知道每个学生的名字,你可以用快排算法来实现。 1、快排算法只适合于有序数组,而不适合于无序数组。 2、如果数组中有很多关键字相同的元素,那么就会导致在查找时会很慢。

  • 以下是三种常用的 Java 快速排序代码:
    1. 递归实现
    ```java
    public static void quickSort(int[] arr, int left, int right) {
    if (left < right) {
    int pivotIndex = partition(arr, left, right);
    quickSort(arr, left, pivotIndex - 1);
    quickSort(arr, pivotIndex + 1, right);
    }
    }
    public static int partition(int[] arr, int left, int right) {
    int pivot = arr[left];
    int i = left + 1;
    int j = right;
    while (i <= j) {
    while (i <= j && arr[i] <= pivot) {
    i++;
    }
    while (i <= j && arr[j] > pivot) {
    j--;
    }
    if (i < j) {
    swap(arr, i, j);
    }
    }
    swap(arr, left, j);
    return j;
    }
    public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    }
    ```
    2. 非递归实现
    ```java
    public static void quickSort(int[] arr, int left, int right) {
    Stack<Integer> stack = new Stack<>();
    stack.push(left);
    stack.push(right);
    while (!stack.isEmpty()) {
    int r = stack.pop();
    int l = stack.pop();
    if (l < r) {
    int pivotIndex = partition(arr, l, r);
    stack.push(l);
    stack.push(pivotIndex - 1);
    stack.push(pivotIndex + 1);
    stack.push(r);
    }
    }
    }
    public static int partition(int[] arr, int left, int right) {
    int pivot = arr[left];
    int i = left + 1;
    int j = right;
    while (i <= j) {
    while (i <= j && arr[i] <= pivot) {
    i++;
    }
    while (i <= j && arr[j] > pivot) {
    j--;
    }
    if (i < j) {
    swap(arr, i, j);
    }
    }
    swap(arr, left, j);
    return j;
    }
    public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    }
    ```
    3. 双路快排
    ```java
    public static void quickSort(int[] arr, int left, int right) {
    if (left < right) {
    int[] pivotIndex = partition(arr, left, right);
    quickSort(arr, left, pivotIndex[0] - 1);
    quickSort(arr, pivotIndex[1] + 1, right);
    }
    }
    public static int[] partition(int[] arr, int left, int right) {
    int pivot = arr[left];
    int i = left + 1;
    int j = right;
    int p = left;
    int q = right + 1;
    while (true) {
    while (i <= j && arr[i] < pivot) {
    i++;
    }
    while (i <= j && arr[j] > pivot) {
    j--;
    }
    if (i > j) {
    break;
    }
    swap(arr, i, j);
    if (arr[i] == pivot) {
    p++;
    swap(arr, p, i);
    }
    if (arr[j] == pivot) {
    q--;
    swap(arr, q, j);
    }
    }
    swap(arr, left, j);
    j--;
    i++;
    for (int k = left + 1; k <= p; k++, j--) {
    swap(arr, k, j);
    }
    for (int k = right; k >= q; k--, i++) {
    swap(arr, k, i);
    }
    return new int[]{j + 1, i - 1};
    }
    public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    }
    ```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录一 :对象锁和类锁

目录 简介 通过8个案例来解释说明 案例及总结 简介 阿里规约【强制】高并发时&#xff0c;同步调用应该去考量锁的性能损耗。能用无锁数据结构&#xff0c;就不要用锁&#xff1b;能 锁区块&#xff0c;就不要锁整个方法体&#xff1b;能用对象锁&#xff0c;就不要用类锁。…

提高工作效率的宝藏网站和宝藏工具

一、好用的网站 面包多 面包多 创作者在面包多&#xff0c;通过出售课程&#xff0c;文章&#xff0c;绘画&#xff0c;创意作品&#xff0c;软件&#xff0c;电子书&#xff0c;音乐&#xff0c; 游戏&#xff0c;咨询服务&#xff0c;每月获得 数百万元 收入。 写作素材模板…

二阶段算法:R-CNN类网络

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

【Java 数据结构】ArrayList的实现和底层源码讲解

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

java day9

第九章 使用swing 9.1 创建应用程序9.1.1 创建页面9.1.2 开发框架9.1.3 创建组件&& 9.1.4 将组件加入到容器中 9.2 使用组件9.2.1 图标9.2.2 标签9.2.3 文本框9.2.4 文本区域9.2.5 可滚动窗格9.2.6 复选框和单选按钮9.2.7 组合框9.2.8 列表 9.1 创建应用程序 import j…

FPGA基于SFP光口实现10G万兆网UDP通信 10G Ethernet Subsystem替代网络PHY芯片 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案4、vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取 1、前言 目前网上的fpga实现udp基本生态如下&#xff1a; 1&#xff1a;verilog编写的udp收发器&#xff0c;但不带ping功能&#xff0c;这样的代…

The GNU nano text editor (文本编辑器)

The GNU nano text editor (文本编辑器) https://www.nano-editor.org/ GNU nano is a small and friendly text editor. 1 GNU nano The GNU nano text editor https://www.nano-editor.org/dist/latest/nano.html Source Code https://git.savannah.gnu.org/cgit/nano.gi…

EIGRP 配置,详解拓扑表,路由汇聚

1.3 EIGRP 拓扑&#xff0c;路由以及汇聚 1.3.1 实验目的 通过对 EIGRP 拓扑&#xff0c;路由以及汇聚相关实验的练习&#xff0c;掌握 EIGRP 建立拓扑信息的方式&#xff0c; 度量计算方法&#xff0c;如何调整度量&#xff0c;非等价负载均衡&#xff0c;以及 EIGRP 末节路…

anaconda ( jupyter notebook ) 安装 Cartopy库

文章目录 一、Cartopy库是什么&#xff1f;二、一步到位安装&#xff08;装不上的话用下面那个方法虚拟环境安装&#xff09;三、如何在anaconda ( jupyter notebook ) 虚拟环境安装 Cartopy库&#xff1f; 一、Cartopy库是什么&#xff1f; Cartopy 是一个开源免费的第三方 P…

mac压缩文件多了__MACOSX目录问题

文章目录 背景原因解决方案&#xff1a;更换压缩方式分析问题拓展&#xff08;.DS_Store&#xff09; 背景 项目中有一个场景&#xff0c;需要把目录压缩为app离线包的zip 但是压缩之后一致打不开&#xff0c;别人上传的zip是好的 原因 如图&#xff0c;我上传的在安卓设备…

D.8零样本文本分类应用:基于UTC的医疗意图分类,打通数据标注-模型训练-模型调优-预测部署全流程。

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

如何制作 ChatGPT 清晰有效咒语与Chat GPT高效交流——基础篇 第二课

在上一篇文章中&#xff0c;我们已经了解了 ChatGPT 的特性、应用范围以及逆天之处。然而&#xff0c;要想获得 ChatGPT 的逆天能力&#xff0c;最关键的一点就是必须掌握准确的“咒语”&#xff0c;即让其能够准确地理解我们所说的话&#xff0c;以及我们想要的东西。本篇文章…

一条记录的多幅面孔-事务的隔离级别与 MVCC

一、事务隔离级别 引出&#xff1a;**事务的隔离性要求&#xff0c;**理论上在某个事务对某个数据进行访问时&#xff0c;其他事务应该进行排队&#xff0c;当该事务提交之后&#xff0c;其他事务才可以继续访问这个数据。我们既想保持事务的 隔离性 &#xff0c;又想让服务器…

CCED,落下帷幕,国产新型编辑技术的锋芒,终于露出来了

大家还记得在DOS时代&#xff0c;你们常用的办公软件有哪些吗&#xff1f; 想必一定少不了朱崇君的CCED和求伯君的WPS吧&#xff0c;前者是字表处理&#xff0c;后者是文字处理。在DOS时代&#xff0c;这两个软件用起来真的是得心应手啊。 而这个时代&#xff0c;也成为了CCE…

jupyter中的魔法函数

在jupyter中&#xff0c;使用魔法函数可以简单的实现一些单纯python要很麻烦才能实现的功能。 1. % 行魔法函数&#xff0c;只对本行代码生效。 2. %% Cell魔法函数&#xff0c;在整个Cell中生效&#xff0c;必须放于Cell首行。 3. %lsmagic&#xff1a; 列出所有的魔法函数 4…

Android Gradle —— flavorDimensions 与 productFlavors

参考&#xff1a; Android Gradle&#xff08;3&#xff09;— FlavorDimensions_积跬步_图腾的博客-CSDN博客 flavorDimensions和productFlavors——安卓gradle_猛猛的小盆友的博客-CSDN博客 多维度打包的介绍 flavorDimensions 从单词字面理解知道是 “风味维度”&#xf…

jsp小练习01--jdbc小练习01

目录 jsp小练习01 jdbc小练习01 设计数据库 以下是一个基本的登录页面&#xff08;login.jsp&#xff09;&#xff1a; 以下是checklogin.jsp页面的示例代码&#xff1a; 以下是main.jsp页面的示例代码&#xff1a; 以下是add.jsp页面的示例代码&#xff1a; 以下是doa…

【2023 · CANN训练营第一季】昇腾AI入门课(Pytorch)——第三章 AI应用开发

第1节 课程概述 第1单元 本课程是否适合您 1.没有深度学习的背景 边学习边补充基础 2.少量深度学习背景&#xff0c;但并不了解华为昇腾 对于昇腾的学习是贯穿全程的 3.听说过或接触过华为昇腾&#xff0c;但不知道如何基于昇腾使能AI应用。 保持学习&#xff0c;按时交作业…

Letcode 两数之和

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以…

Wi-Fi 6(802.11ax)解析12:下行OFDMA接入机制(DL-OFDMA)

序言 在介绍完802.11ax的信道接入以及其触发帧机制后&#xff0c;本文着重介绍下行OFDMA的接入机制&#xff08;即DL-OFDMA&#xff09; 下行OFDMA接入机制&#xff08;DL-OFDMA&#xff09; OFDMA是一种多用户通信机制&#xff0c;其只适用于802.11ax AP和802.11ax用户之间…