排序进行曲-v4.0

news2024/11/28 14:36:09

文章目录

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

小程一言

这篇文章是在排序进行曲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.coloradmin.cn/o/843728.html

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

相关文章

二、框架篇

框架篇 Spring 1. 基础核心技术 第1章-Spring的模块与应用场景 第2章-Spring基于XML配置的容器 第3章-Spring基于注解配置的容器 第4章-Spring基于Java配置的容器 第5章-Spring三种配置方式的混合和迁移 第6章-Spring同类型多个Bean的注入 第7章-Spring的Bean生命周期…

Mybatis案例-商品的增删改查

文章目录 1. aim2.环境准备3.查询3.1 查所有3.2 查看详情3.3 条件查询3.3.1 Mybatics如何接收参数&#xff1f;3.3.2 多条件查询3.3.3 动态条件查询3.3.4 单条件查询 4.添加主键返回 5.修改5.1 修改全部字段5.2 修改动态字段 6.删除6.1 删除1个6.2 批量删除 JDBC完成&#xff1…

【0804作业】顺序执行2个线程 (完成逆置打印、拷贝文件) (实现类似cat打印到终端)

作业1&#xff1a; 要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件 要求定义一个全局变量 char buf[] "1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件&#xff0c;另&#xff1a; A线程循…

前端食堂技术周刊第 93 期:7 月登陆 Web 平台的新功能、Node.js 工具箱、Nuxt3 开发技巧、MF 重构方案

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;橙橙冰萃美式 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来…

第二天 什么是JWT ?

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 每天一个知识点 ✨特色专…

RocketMQ 主备自动切换模式部署

目录 主备自动切换模式部署 Controller 部署​ Controller 嵌入 NameServer 部署​ Controller 独立部署​ Broker 部署​ 兼容性​ 升级注意事项​ 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群&#xff0c;其架构如上图所示&#xff…

c++实现Qt信号和槽机制

文章目录 简介信号槽信号与槽的连接 特点观察者模式定义观察者模式结构图 实现简单的信号和槽 简介 信号槽机制与Windows下消息机制类似&#xff0c;消息机制是基于回调函数&#xff0c;Qt中用信号与槽来代替函数指针&#xff0c;使程序更安全简洁。  信号和槽机制是 Qt 的核心…

Scratch 之 大地图引擎怎么做?

引子 简单的介绍一下&#xff0c;一些游戏引擎是有一个隐形小地图存在的&#xff0c;这个隐形小地图通常用来侦测碰碰撞和移动。那么&#xff0c;一个大地图引擎的背景肯定是很大的(一般来说大小都超过200)&#xff0c;如果我们要做出一个枪战作品&#xff0c;那就迟早会发现一…

Spring源码解析(七):bean后置处理器AutowiredAnnotationBeanPostProcessor

Spring源码系列文章 Spring源码解析(一)&#xff1a;环境搭建 Spring源码解析(二)&#xff1a;bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三)&#xff1a;bean容器的刷新 Spring源码解析(四)&#xff1a;单例bean的创建流程 Spring源码解析(五)&…

IBM HR Analytics 员工流失 EDA 和可视化绩效分析

IBM HR Analytics 员工流失与绩效分析 背景导入库输出前五行数据清洗检查空值删除不必要的列 可视化商务旅行直方图离家的距离箱形图教育与数字公司的关系年龄和月收入散点图按教育领域和工作角色划分的工作满意度相关矩阵的交互式热图 背景 揭示导致员工流失的因素&#xff0…

陪诊小程序开发|陪诊系统定制|数字化医疗改善就医条件

健康问题这几年成为人们关注的焦点之一&#xff0c;然而看病却是一个非常麻烦的过程&#xff0c;特别是对于那些身处陌生城市或者不熟悉就医流程的人来说。幸运的是现在有了陪诊小程序下&#xff0c;为您提供便捷的助医服务&#xff0c;使得就医过程得更加简单和轻松。 陪诊系统…

国联易安网页防篡改保护系统“渠道招募”启动啦!

作为业内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全的领军企业&#xff0c;国联易安网页防篡改保护系统基于“高效同步”、“安全传输”两项技术&#xff0c;具备了独特的“五重防护”新特性&#xff0c;支持网页的全自动发布、网页监控、报警和自…

webpack基础知识十:与webpack类似的工具还有哪些?区别?

一、模块化工具 模块化是一种处理复杂系统分解为更好的可管理模块的方式 可以用来分割&#xff0c;组织和打包应用。每个模块完成一个特定的子功能&#xff0c;所有的模块按某种方法组装起来&#xff0c;成为一个整体(bundle) 在前端领域中&#xff0c;并非只有webpack这一款…

c51单片机16个按键密码锁源代码(富proteus电路图)

注意了&#xff1a;这个代码你是没法直接运行的&#xff0c;但是如果你看得懂&#xff0c;随便改一改不超过1分钟就可以用 #include "reg51.h" #include "myheader.h" void displayNumber(unsigned char num) {if(num1){P10XFF;P10P11P14P15P160;}else if…

js修改img的src属性显示变换图片到前端页面,img的src属性显示java后台读取返回的本地图片

文章目录 前言一、HTML 图像- 图像标签&#xff08; <img>&#xff09;1.1图像标签的源属性&#xff08;Src&#xff09;1.2图像标签源属性&#xff08;Src&#xff09;显示项目中图片1.3图像标签源属性&#xff08;Src&#xff09;显示网络图片 二、图像标签&#xff08…

韦东山Linux驱动入门实验班(6)LED驱动---设备树

前言 &#xff08;1&#xff09;在韦东山Linux驱动入门实验班&#xff08;5&#xff09;LED驱动—驱动分层和分离&#xff0c;平台总线模型我们已经讲解了如何将驱动程序和硬件程序进行剥离。但是大佬们感觉这样还不行&#xff0c;他们认为要专门弄一个结构存储硬件信息&#x…

树,森林的遍历,以及其与二叉树遍历之间的关系

树和森林的的遍历 树的遍历 先根遍历 以下列树为演示 首先将树转化成二叉树&#xff08;孩子兄弟表示法&#xff1a;就是每个节点的左边连着它的左孩子&#xff0c;右边连自己右边的第一个兄弟&#xff09; 然后把转化为的二叉树进行先序遍历&#xff0c;中序遍历 进行先序…

【c语言初级】c++基础

文章目录 1. C关键字2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.2 C函数重载的原理--名字修饰采用C语言编译器编译后结果 1. C关键字 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想…

Spring Cloud Alibaba官方网站

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 官方网站 SCA&#xff08;Spring Cloud Alibaba&#xff09;为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有核心组件&#xff0c;使您可以轻松地…