当前位置: 首页 > news >正文

数据结构-快速排序

一.概要

快速排序是一种基于分治思想的排序算法,其基本思路是选取一个基准值(pivot),通过一趟排序将待排序列分成两个部分,其中左半部分都小于基准值,右半部分都大于基准值,然后对左右两部分分别递归地进行快速排序,最终得到有序序列。

具体的实现过程如下:

  1. 选取基准值

任意选定一个数作为基准值。

  1. 分割操作

设定两个指针,左指针和右指针,分别指向序列的开头和结尾。从右指针开始向左扫描,找到第一个小于基准值的元素,将其与左指针所指的元素交换位置。然后从左指针开始向右扫描,找到第一个大于基准值的元素,将其与右指针所指的元素交换位置。重复以上过程,直到左指针与右指针相遇,此时将基准值与相遇位置的元素交换。

  1. 递归操作

递归地对左右两部分分别进行快速排序,直到每个部分只有一个元素或为空。

最终得到一个有序序列。

快速排序的时间复杂度是 O(nlogn),平均情况下比较快,最坏情况下为 O(n^2),是一种不稳定的排序算法。在实际应用中,可以通过随机选择基准值、三数取中等方法来避免出现最坏情况,提高排序效率。

二、代码实现

int  GetMidNumi(int* a, int left, int right)
{int mid = (left + right) / 2;if (a[left]<a[mid]){if (a[mid]<a[right]){return mid;}else if (a[left]>a[right]){return left;}else{return right;}}else{if (a[mid]>a[right]){return mid;}else if(a[left]<a[right]){return left;}else{return right;}}
}void QuickSort(int* a, int left, int right){if (left > right)return;int begin = left, end = right;//随机选KEY//int randi = left + (rand() % (right - left));//Swap(&a[left], &a[randi]);//三数取中int midi = GetMidNumi(a, left, right);Swap( &a[midi], &a[left]);int keyi = left;while (left < right){//右边找小while (left < right && a[right] >= a[keyi])--right;//左边找大while (left < right && a[left] <= a[keyi])++left;Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);keyi = left;QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}

这段代码是实现快速排序的程序,具体工作流程如下:

  1. 选取关键字 keyi,一般选择序列中的第一个元素。
  2. 从序列的两端开始搜索,右边找到小于keyi的元素,左边找到大于keyi的元素,然后交换这两个元素的位置。
  3. 继续执行步骤2,直到左右指针相遇。
  4. 将关键字 keyi 与相遇位置的元素交换位置。
  5. 递归地对左右两部分分别进行快速排序。

在实现过程中,该程序使用了三数取中的方法来选择关键字,避免了最坏情况的发生。同时,在搜索元素时,也采用了双向搜索的方法,提高了排序效率。

整个快速排序的时间复杂度为 O(nlogn),最坏情况下为 O(n^2),空间复杂度为 O(logn),是一种高效的排序算法。

三、总结

快速排序是一种基于分治思想的排序算法。其基本思想是选取一个基准值,通过一趟排序将待排序列分成两个部分,其中左半部分都小于基准值,右半部分都大于基准值,然后对左右两部分分别递归地进行快速排序,最终得到有序序列。

快速排序具有以下优点:

  1. 时间复杂度较低:平均时间复杂度为 O(nlogn),在实践中表现良好,较适合大规模数据的排序。

  2. 空间复杂度较低:空间复杂度为 O(logn),不需要额外的存储空间,能够节省内存。

  3. 实现简单:快速排序的实现比较简单,易于理解和掌握。

但是快速排序也存在以下缺点:

  1. 最坏情况下时间复杂度较高:在某些特殊情况下,如原序列已经排好序或基准值选择不当时,快速排序的时间复杂度会退化到 O(n^2)。

  2. 不适合稳定性排序:由于交换过程不一定保证元素的相对位置不变,因此快速排序不适合对序列中有相同元素的数据进行排序。

针对上述缺点,可以采用以下方法来改进快速排序:

  1. 随机选取基准值:避免最坏情况的发生,提高排序效率。

  2. 三数取中法选取基准值:通过选取序列头、尾和中间位置的元素的中位数作为基准值,避免最坏情况的发生,提高排序效率。

  3. 在小规模数据时采用插入排序:当待排序的子序列长度小于一定值时,采用插入排序代替快速排序,可以降低算法的时间复杂度。

相关文章:

数据结构-快速排序

一.概要 快速排序是一种基于分治思想的排序算法&#xff0c;其基本思路是选取一个基准值&#xff08;pivot&#xff09;&#xff0c;通过一趟排序将待排序列分成两个部分&#xff0c;其中左半部分都小于基准值&#xff0c;右半部分都大于基准值&#xff0c;然后对左右两部分分…...

WuThreat身份安全云-TVD每日漏洞情报-2023-04-10

漏洞名称:Apple iOS/iPadOS 越界写入 漏洞级别:高危 漏洞编号:CVE-2023-28206 相关涉及:Apple iOS <16.4.0 漏洞状态:在野 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-08810 漏洞名称:PHPGurukul Bank Locker Management System SQL 注入 漏洞级别:高…...

IDEA中查看源码点击Download Sources时出现Cannot download sources的问题复现及解决

IDEA中查看源码点击Download Sources时出现Cannot download sources的问题复现及解决 注意&#xff1a;实验环境的IDEA版本&#xff1a;2021.3.1 1、问题描述 1.1、当想看源码时&#xff0c;点击Download Sources 1.2、此时出现了Cannot download sources 2、解决办法 2.1、…...

R+VIC模型融合实践技术应用及未来气候变化模型预测/SWAT/HSPF/HEC-HMS

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…...

Python 02 数据类型(04元组)

一、元组 元组和列表的唯一不同&#xff1a;不能直接对元组的元素进行修改&#xff0c;删除&#xff0c;添加。 不能修改 1.1 创建元组 1.1.1 创建一个空元组 touple1() # ‘() 里面没有元素&#xff0c;表示为空元组 1.1.2 元组可以容纳任意数据类型的数据的有序集合&…...

WMS:入库库作业流程状态定位

系列文章目录 例如&#xff1a;第一章 WMS&#xff1a;入库库作业流程状态定位 目录 系列文章目录 文章目录 前言 一、入库订单作业状态 二、入库任务级作业状态 1.收货作业 2.验收作业 总结 前言 WMS系统在仓储作业的管理中发挥着至关重要的作用&#xff0c;其核心优势在于强大…...

蓝易云:Linux系统【Centos7】如何配置完整的CC攻击防护策略

完整的CC攻击防护策略包括以下步骤&#xff1a; 1. 调整内核参数 在CentOS 7系统中&#xff0c;可以通过修改内核参数来增加系统对CC攻击的抵抗力。具体操作如下&#xff1a; &#xff08;1&#xff09;打开sysctl.conf文件&#xff1a; vim /etc/sysctl.conf &#xff08…...

编解码持续升级,「硬」实力铸就视频云最优解

算力时代&#xff0c;视频云需要怎样的 CPU&#xff1f; 在数据爆发式增长及算法日益精进的大背景下&#xff0c;属于「算力」的时代俨然到来。随着视频成为互联网流量的主角&#xff0c;日趋饱和的音视频场景渗透率、人类对“感官之限”的追求与突破、更多元化的场景探索及技术…...

贵金属技术分析的止损保护

前面说过我们这些小散户&#xff0c;最多也不过十几万或者几万美金的账户&#xff0c;没有必要想国际的一些大基金那样&#xff0c;又锁仓&#xff0c;又对冲什么的&#xff0c;我们资金小的投资者&#xff0c;足够灵活&#xff0c;自然有我们存活的方法。所以我们要注意发挥我…...

Python 进阶指南(编程轻松进阶):三、使用 Black 工具来格式化代码

原文&#xff1a;http://inventwithpython.com/beyond/chapter3.html 代码格式化是将一组规则应用于源代码&#xff0c;从而使得代码风格能够简洁统一。虽然代码格式对解析程序的计算机来说不重要&#xff0c;但代码格式对于可读性是至关重要的&#xff0c;这是维护代码所必需的…...

计算机应用辅导大纲及真题

00019考试 湖北省高等教育自学考试实践&#xff08;技能&#xff09;课程大纲 课程名称&#xff1a;计算机应用基础&#xff08;实践&#xff09; 课程代码&#xff1a;00019 实践能力的培养目标。 计算机应用基础&#xff08;实践&#xff09;是高等教育自学考试多…...

【Go基础】一篇文章带你全面了解学习—切片

目录 1、切片注意点 2、声明切片 3、切片初始化 4、切片的内存布局...

2022国赛28:centos8.5离线安装docker

大赛试题内容: 八、虚拟化(20分) 在Linux2上安装docker-ce,导入centos镜像。软件包和镜像存放在物理机D:\soft\DockerLinux。创建名称为skills的容器,映射Linux2的80端口到容器的80端口,在容器内安装apache2,默认网页内容为“HelloContainer”。解答过程: 下载CENTOS8镜…...

JVM专题

JVM类加载 Java里有如下几种类加载器&#xff1a; 引导类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的核心类库&#xff0c;比如 rt.jar、charsets.jar等 扩展类加载器&#xff1a;负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包应用程序…...

蓝桥杯模板题目

A:::::::::::::::小王子单链表&#xff08;链表&#xff09; 题目描述 小王子有一天迷上了排队的游戏&#xff0c;桌子上有标号为 1−10 的 10 个玩具&#xff0c;现在小王子将他们排成一列&#xff0c;可小王子还是太小了&#xff0c;他不确定他到底想把那个玩具摆在哪里&…...

SAP IDT - Building Data Foundation

To build a Data Foundation, it can be created on a Local Project view. Right-click under Local Project → New → Data Foundation. You can select a Single-source enabled or Multi-source enabled. Follow the wizard and select the connections. Data Foundatio…...

【Python】【进阶篇】三、Python爬虫的构建User-Agnet代理池

目录三、Python爬虫的构建User-Agnet代理池3.1 自定义UA代理池3.2 模块随机获取UA三、Python爬虫的构建User-Agnet代理池 在编写爬虫程序时&#xff0c;一般都会构建一个 User-Agent &#xff08;用户代理&#xff09;池&#xff0c;就是把多个浏览器的 UA 信息放进列表中&…...

数据结构.双链表的各种操作

//双链表 //单链表无法逆向检索&#xff0c;双链表可进可退 双链表比单链表多啦一个前驱指针 //双链表查找时间复杂度都为o(n) #include<bits/stdc.h> using namespace std; typedef struct donde //创建双链表 {int data;dnode *next,*prior; //前驱和后继 }dnode,*…...

去年12月被无情辞退,三个月后我携手自动化测试神技王者归来

引言 不知不觉在软件测试行业工作了3年之久&#xff0c;虽然说我是主做的功能测试&#xff0c;但是我也一直是兢兢业业的呀&#xff0c;不曾想去年7月份无情被辞的消息让我感到一阵沉重。我曾经一直坚信自己的技能和经验足以支撑我在这个领域的未来&#xff0c;但现实却告诉我&…...

区块链技术之共识机制

“共识机制”一词通常通俗地用于指代“股权证明”、“工作证明”或“权威证明”协议。然而&#xff0c;这些只是防止女巫攻击的共识机制的组成部分&#xff0c;共识机制是思想、协议和激励的完整堆栈&#xff0c;使一组分布式节点能够就区块链的状态达成一致。共识机制是区块链…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...