排序进行曲-v4.0

文章目录

  • 小程一言
    • 快速排序
      • 步骤
        • 详细解释
        • 具体步骤
      • 举例
        • 总结
      • 复杂度分析
        • 时间复杂度分析:
        • 空间复杂度分析:
        • 注意
      • 应用场景
        • 总结
      • 实际举例
        • 结果
        • 总结
      • 代码实现
        • 结果
        • 解释

小程一言

这篇文章是在排序进行曲3.0之后的续讲,
这篇文章主要是对快速排序进行细致分析,以及操作。
希望大家多多支持

在这里插入图片描述

快速排序

基于分治的思想。它的基本思想是通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录进行排序,从而达到整个序列有序的目的。

步骤

详细解释


选择基准元素:从待排序序列中选择一个元素作为基准元素。一般可以选择第一个元素、最后一个元素或者随
机选择一个元素作为基准元素。分割操作:根据基准元素,将待排序序列分割成两个子序列。一个子序列中的元素都小于基准元素,另一个子
序列中的元素都大于基准元素。这个过程称为分割操作。递归排序:对两个子序列分别进行快速排序,直到子序列的长度为1或者0,即子序列已经有序。合并结果:将排序好的两个子序列合并,即将左子序列、基准元素和右子序列依次拼接起来,得到最终的有序
序列。

在这里插入图片描述

具体步骤


选择基准元素,假设选择第一个元素作为基准元素。设置两个指针,一个指向序列的第一个元素(左指针),一个指向序列的最后一个元素(右指针)。左指针向右移动,直到找到一个大于基准元素的元素。右指针向左移动,直到找到一个小于基准元素的元素。如果左指针小于右指针,则交换这两个元素。重复步骤3到步骤5,直到左指针大于等于右指针。将基准元素与左指针所指的元素进行交换,此时基准元素左边的元素都小于基准元素,右边的元素都大于基准元素。对基准元素左边的子序列和右边的子序列分别进行递归排序。合并结果,即将左子序列、基准元素和右子序列依次拼接起来,得到最终的有序序列。快速排序的时间复杂度为O(nlogn),其中n为待排序序列的长度。

在这里插入图片描述

举例

假设有一个待排序序列为[5, 3, 8, 2, 1, 9, 4, 7, 6],下面以此序列为例进行快速排序。选择基准元素:选择第一个元素5作为基准元素。分割操作:根据基准元素5,将序列分割成两个子序列。比5小的元素放在左边,比5大的元素放在右边。分割后的序列为[2, 1, 4, 3] 5 [9, 8, 7, 6]。递归排序:对左右两个子序列进行递归排序。对左子序列[2, 1, 4, 3]进行快速排序,选择基准元素2。分割后的序列为[1] 2 [4, 3]。对右子序列[9, 8, 7, 6]进行快速排序,选择基准元素9。分割后的序列为[8, 7, 6] 9 []。继续对左子序列[4, 3]进行快速排序,选择基准元素4。分割后的序列为[3] 4 []。对右子序列[8, 7, 6]进行快速排序,选择基准元素8。分割后的序列为[6, 7] 8 []。继续对左子序列[3]进行快速排序,选择基准元素3。分割后的序列为[] 3 []。对右子序列[6, 7]进行快速排序,选择基准元素6。分割后的序列为[6] 7 []。合并结果:将排序好的子序列合并。最终的有序序列为[1, 2, 3, 4, 5, 6, 7, 8, 9]。

总结

通过以上步骤,我们可以看到快速排序将原始序列不断分割成两个子序列,并对子序列进行递归排序,最终将所
有子序列合并成一个有序序列。

在这里插入图片描述

复杂度分析

快速排序的时间复杂度为O(nlogn),其中n为待排序序列的长度。

时间复杂度分析:


在最好情况下,每次分割操作都能将序列均匀地分成两部分,此时快速排序的时间复杂度为O(nlogn)。在最坏情况下,每次分割操作都将序列分成一个较小的子序列和一个较大的子序列,此时快速排序的时间复杂度为O(n^2)。最坏情况发生在待排序序列已经有序或基本有序的情况下。平均情况下,快速排序的时间复杂度仍然为O(nlogn)。这是因为在每一次分割操作中,将序列分成两部分的概率大致相等,每次分割操作的平均时间复杂度为O(n)。根据分治法的思想,快速排序的平均时间复杂度可以近似地看作是每次分割操作的时间复杂度乘以递归的层数,即O(nlogn)。

空间复杂度分析:

快速排序的空间复杂度为O(logn),主要是由于递归调用造成的栈空间使用。在最坏情况下,递归的层数为n,此时空间复杂度为O(n)。在平均情况下,递归的层数为logn,此时空间复杂度为O(logn)。

在这里插入图片描述

注意

总结起来,快速排序是一种高效的排序算法,平均情况下的时间复杂度为O(nlogn),空间复杂度为O(logn)。但在最坏情况下,时间复杂度可能达到O(n^2),需要额外的优化措施来避免最坏情况的发生。

应用场景

排序算法:快速排序是一种常用的排序算法,被广泛应用于各种排序任务中。它的时间复杂度较低,适用于处理大规模数据。数据库查询:在数据库中,经常需要对查询结果进行排序。快速排序可以在较短的时间内对查询结果进行排序,提高查询效率。文件系统排序:在文件系统中,需要对文件进行排序,以便更好地组织和管理文件。快速排序可以快速地对文件进行排序,提高文件系统的性能。搜索引擎排序:在搜索引擎中,需要对搜索结果进行排序,以便将相关度较高的结果排在前面。快速排序可以快速地对搜索结果进行排序,提高搜索引擎的效率。数据分析:在数据分析领域,经常需要对大量数据进行排序和统计。快速排序可以快速地对数据进行排序,为数据分析提供支持。

在这里插入图片描述

总结

快速排序是一种高效的排序算法,在大规模数据的排序和处理任务中具有广泛的应用场景。它的时间复杂度较低,适用于各种需要排序的场景。

实际举例

假设有一个学生信息表,包含学生的姓名、学号和成绩。我们希望按照成绩对学生进行排序,从高到低。快速排序可以很好地应用于这个场景。下面是一个使用快速排序对学生信息表按成绩排序的实际举例:原始数据:假设有以下学生信息表(按成绩从高到低排列):学生1:姓名-张三,学号-001,成绩-90
学生2:姓名-李四,学号-002,成绩-85
学生3:姓名-王五,学号-003,成绩-95
学生4:姓名-赵六,学号-004,成绩-80
选择基准元素:选择一个基准元素,可以是任意一个学生的成绩。假设选择学生3作为基准元素。分割操作:将学生信息表分割成两个子序列,一个序列包含所有成绩大于等于基准元素的学生,另一个序列包含所有成绩小于基准元素的学生。子序列1:学生3(成绩95)
子序列2:学生1(成绩90)、学生2(成绩85)、学生4(成绩80)
递归排序:对子序列1和子序列2分别进行递归排序,重复上述步骤,直到子序列只包含一个元素或为空。合并操作:将排序后的子序列合并,得到最终的有序序列。

结果

排序后的序列:学生3(成绩95)、学生1(成绩90)、学生2(成绩85)、学生4(成绩80)

总结

通过快速排序,我们成功将学生信息表按成绩从高到低排序。这个例子展示了快速排序在实际中的应用,通过选择基准元素、分割操作、递归排序和合并操作,可以高效地对大量数据进行排序。

代码实现

public class QuickSort {public static void main(String[] args) {int[] arr = {5, 2, 8, 9, 1, 3};quickSort(arr, 0, arr.length - 1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivotIndex = partition(arr, low, high);quickSort(arr, low, pivotIndex - 1);quickSort(arr, pivotIndex + 1, high);}}public static int partition(int[] arr, int low, int high) {int pivot = arr[high]; // 选择最后一个元素作为基准元素int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;swap(arr, i, j);}}swap(arr, i + 1, high);return i + 1;}public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

结果

输出排序后的数组。运行结果为[1, 2, 3, 5, 8, 9],说明快速排序算法正确地对数组进行了排序。

解释

在上面的代码中,我们使用了递归的方式实现快速排序。首先定义了一个quickSort方法,接受一个数组和数组的起始位置和结束位置作为参数。在quickSort方法中,首先判断起始位置是否小于结束位置,如果是,则进行以下操作:调用partition方法,将数组分割成两个子序列,并返回基准元素的索引。对子序列1(起始位置到基准元素索引-1)和子序列2(基准元素索引+1到结束位置)分别递归调用quickSort方法,继续进行排序。递归结束后,数组将被排序。在partition方法中,我们选择最后一个元素作为基准元素。然后使用两个指针i和j,从起始位置开始遍历数组。如果遇到比基准元素小的元素,将i指针向后移动一位,并交换i和j指向的元素。遍历结束后,将基准元素与i+1位置的元素交换,确保基准元素的位置正确。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs中的path.json和path.resolve的区别

nodejs中的path.json和path.resolve的区别 我们有多少次在 Node.js 项目中遇到过path.join()和path.resolve()却没有真正理解它们之间的区别&#xff1f;本文就讲解一下这两者的区别。 重要术语 首先我们先来看看几个术语&#xff0c;便于后续我们掌握这两者的差异。 字符串…

libcurl开源的、跨平台的网络传输库,用于在程序中实现数据传输功能的编译

文章目录 前言1、libcurl关键特点和功能2、没有使用openssl以及libssh2编译libcurl的文件和使用openssl和libssh2编译3、libcurl网络库的下载4、libcurl网络库的编译4.1、直接使用cmake编译&#xff0c;不使用 OpenSSL 和 libssh2库编译的出来的libcurl库4.2、使用 OpenSSL 和 …

peerDependency到底是什么

peerDependency到底是什么 正常开发中&#xff0c;我们经常接触到的是 package.json 中的 dependencies 和 devDependencies, 本文不对上面两个进行细节分析&#xff0c;让我们来看看 peerDependencies 是什么&#xff1f; 在 NPM v7 中&#xff0c;默认安装 peerDependencies…

虹科案例|如何分析设备故障时间和次数,打破生产瓶颈?

虹科设备绩效管理系统 保障生产设备的稳定性和可靠性 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶…

Arthas协助MQ消费性能优化

背景 项目中使用AWS的SQS消息队列进行异步处理&#xff0c;QA通过压测发现单机TPS在23左右&#xff0c;目标性能在500TPS&#xff0c;所以需要对消费逻辑进行优化&#xff0c;提升消费速度。 目标 消费TPS从23提升到500 优化流程 优化的思路是先分析定位性能瓶颈&#xff…

SpringBoot使用redis作为缓存的实例

目录 什么是缓存&#xff1f; 缓存的作用&#xff1f; 缓存的成本&#xff1f; 实际项目中的应用 代码展示 什么是缓存&#xff1f; 缓存就是数据交换的缓冲区&#xff08;称作Cache [ kʃ ] &#xff09;&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 缓…

[数据集][目标检测]遛狗不牵绳数据集VOC格式-1980张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1980 标注数量(xml文件个数)&#xff1a;1980 标注类别数&#xff1a;5 标注类别名称:["dog","p…

C# Blazor 学习笔记(0):初识Blazor

文章目录 Blazor是什么适合人群 开始学习BlazorBlazor资源如何创建BlazorBlazor 基础知识介绍文件分布Razor和cshtml的区别Razor介绍 Blazor是什么 Blazor是微软推出的前端框架&#xff0c;有两种形式&#xff0c;以下以Blazor Server为主。具有一下特点 前端是用C#而不是JS前…

STM32使用HAL库中外设初始化MSP回调机制及中断回调机制详解

STM32使用HAL库之Msp回调函数 1.问题提出 在STM32的HAL库使用中&#xff0c;会发现库函数大都被设计成了一对&#xff1a; HAL_PPP/PPPP_Init HAL_PPP/PPPP_MspInit 而且HAL_PPP/PPPP_MspInit函数的defination前面还会有__weak关键字 上面的PPP/PPPP代表常见外设的名称为…

模板方法设计模式(C++)

定义 定义一个操作中的算法的骨架(稳定&#xff09;,而将一些步骤延迟(变化&#xff09;到子类中。Template Method使得子类可以不改变(复用&#xff09;一个算法的结构即可重定义(override重写)该算法的某些特定步骤。 ——《设计模式》GoF Template Method模式是一种非常基…

元素2D转3D 椭圆形旋转实现

椭圆旋转功能展示 transform-style: preserve-3d;&#xff08;主要css代码&#xff09; gif示例&#xff08;背景图可插入透明以此实现边框线的旋转&#xff09; 导致的无法点击遮挡问题可以参考我的另一个文章 穿透属性-----------------------css穿透属性 实时代码展示

Unity之webgl端通过vue3接入腾讯云联络中心SDK

腾讯云联络中心SDK:云联络中心 Web-SDK 开发指南-文档中心-腾讯云 (tencent.com) 1 首先下载Demo ​ 1.1 对其进行解压 ​ 1.2根据文档操作 查看README.md,根据说明设置server下的dev.js里的相关参数。 然后打开电脑终端&#xff0c;cd到项目的路径&#xff1a; ​ 安装…

kafka权威指南(阅读摘录)

零复制 Kafka 使用零复制技术向客户端发送消息——也就是说&#xff0c;Kafka 直接把消息从文件&#xff08;或者更确切地说是 Linux 文件系统缓存&#xff09;里发送到网络通道&#xff0c;而不需要经过任何中间缓冲区。这是 Kafka 与其他大部分数据库系统不一样的地方&#…

单元测试之 - Review一个微服务的单元测试

这里以github上一个microservice的demo代码为例&#xff0c;来看看如何为一个完整的服务编写单元测试。具体代码如下所示&#xff0c;我们重点查看一下catalog和customer&#xff0c;order中的单元测试有哪些。 首先来看catalog服务的单元测试,这个服务下面主要编写了CatalogWe…

什么是微服务

微服务的架构特征&#xff1a; 单一职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责自治&#xff1a;团队独立、技术独立、数据独立&#xff0c;独立部署和交付面向服务&#xff1a;服务提供统一标准的接口&#xff0…

交通运输安全大数据分析解决方案

当前运输市场竞争激烈&#xff0c;道路运输企业受传统经营观念影响&#xff0c;企业管理者安全意识淡薄&#xff0c;从业人员规范化、流程化的管理水平较低&#xff0c;导致制度规范在落实过程中未能有效监督与管理&#xff0c;执行过程中出现较严重的偏差&#xff0c;其营运车…

【性能测试】性能数据采集工具nmon安装使用及报告参数含义详解

目录 nmon nmon下载 解压安装 启动 数据采集配置 生成图形结果 nmon报告中的参数含义 资料获取方法 nmon nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具&#xff0c;它能在系统运行过程中实时地捕捉系统资源的使用情况&#xff0c;并且能输出结果到文…

中小企业实施MES管理系统,这几点需要注意

制造业是中国经济命脉所系&#xff0c;是立国之本、强国之基。作为世界制造大国&#xff0c;制造业一直是热门话题。当下&#xff0c;中小制造企业的产业地位不断提升&#xff0c;想要规范生产制造、提升产品竞争力&#xff0c;进行实施MES管理系统解决方案的企业越来越多。那么…

Redis缓存预热

说明&#xff1a;项目中使用到Redis&#xff0c;正常情况&#xff0c;我们会在用户首次查询数据的同时把该数据按照一定命名规则&#xff0c;存储到Redis中&#xff0c;称为冷启动&#xff08;如下图&#xff09;&#xff0c;这种方式在一些情况下可能会给数据库带来较大的压力…

不懂这些专业名词,你很难成为有水平的项目经理——数据分析篇

大家好&#xff0c;我是老原。 前段时间我们项目组招了个新人小林&#xff0c;让他去和产品经理对下产品上线情况&#xff0c;等到下班也没等来反馈。 第二天在茶水间遇到了产品经理就问了一嘴&#xff0c;才知道已经对接到位了。 一问小林才知道&#xff0c;他完全不知道产…