快速排序:非递归的优势与性能详解

简介: 快速排序:非递归的优势与性能详解

📋 前言

快排的性能和各个综合性能都是排序梯队里面最顶尖的,虽然我们掌握递归的方法来快速实现快排,但是递归堆栈的消耗太大了为此我们专门还优化了快排

一、为什么要掌握非递归

递归来实现快排虽然很简单但是堆栈的消耗很大,所以掌握非递归不仅可以避免递归调用的开销。还能来以此来检验我们的递归能力

在有些场景限制递归深度的时候,例如在嵌入式系统或对递归深度有限制的环境中,非递归就是我们必须掌握的了使得我们的算法可以应用于各种场景

二、栈区和堆区的大小对比

为什么我们一直在说要避免栈区开调用开销,来节省栈的空间呢?其实是因为在操作系统的概念中栈是一快用来快速存储的区域

  • 在32位操作系统中栈一般的内存只有 10M
  • 而堆的内存划分却达到了 2G

三、非递归实现快排的思想

非递归其实就是利用迭代的思想来替换递归的过程,我们主要考虑的就是 每次 递归的区间怎么控制:

其实我们这里可以考虑使用人工栈的思想来存放每次的区间栈的特点是后进先出而我们递归也是每次先递归 跟 和左子树之后再来进行递归右边的算法

3.1 利用人工栈来实现递归

🔥 注:这里是吧 POP 栈也录入进去了是方便观察实际上是右边 POP 完了之后再 Push 右边。

既然是利用人工栈那么我们首先肯定是先来创建一个栈来把第一个区间录入进去:

  • 然后进行循环当栈位空的时候说明我们的数组就递归完了

3.2 实现代码

🍸 代码演示:

// 快速排序 非递归实现
void QuickSortNonR(int* a, int left, int right)
{
  ST st;
  STInit(&st);
  STPush(&st, right);
  STPush(&st, left);
  while (!STEmpty(&st))
  {
    int left = STTop(&st);
    STPop(&st);
    int right = STTop(&st);
    STPop(&st);
    int keyi = PartSort3(a, left, right);
    // [left, keyi-1] [keyi+1, right]
    if (keyi + 1 < right)
    { 
      STPush(&st, right);
      STPush(&st, keyi + 1);
    }
    if (left < keyi - 1)
    {
      STPush(&st, keyi - 1);
      STPush(&st, left);
    }
  }
  STDestory(&st);
}

四、快速排序总结

快速排序的特性总结:

  1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
  2. 时间复杂度:O(N*logN)

  1. 空间复杂度:O(logN)
  2. 稳定性:不稳定
目录
相关文章
|
物联网 网络性能优化 API
MQTT常见问题之单个消息发送数据不能超过64k如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
Kubernetes 容器
kubeadm 部署的 k8s 增加 ip 并重新生成证书
kubeadm 部署的 k8s 增加 ip 并重新生成证书
1456 0
|
7月前
|
API 数据库 开发者
免费的批量标签制作软件,这几款值得一试
如果你所在团队需要在有限预算下实现批量标签制作、打印和二维码管理,可以优先选择草料二维码(仅需二维码标签的场景)。对于信息化程度较高或有定制需求的企业,也可考虑 BarTender 等商业软件。电商/仓储等需要频繁打印的用户,可以考虑精臣打印机+云打印软件的行驶时,成本更可控
免费的批量标签制作软件,这几款值得一试
|
存储 SQL 数据挖掘
GCP大数据分析工具:BigQuery使用指南
【7月更文挑战第15天】BigQuery作为GCP中的一项重要大数据分析工具,以其高性能、可扩展性和易用性,在数据仓库、实时数据分析、日志分析等多个领域发挥着重要作用。通过本文的介绍,读者可以了解到BigQuery的基本功能、使用场景以及配置和使用方法,为后续的数据分析和业务决策提供支持。希望读者能够充分利用BigQuery的强大能力,挖掘数据背后的价值,为企业的发展贡献力量。
1859 3
|
机器学习/深度学习 搜索推荐 数据可视化
大数据用户画像之基本概念
大数据用户画像利用大数据技术分析用户基本信息、消费行为、兴趣、社交及地理数据,创建详细用户模型,助力企业精准营销。涉及技术包括数据挖掘、大数据处理(Hadoop、Spark)、数据可视化、机器学习和数据库管理。通过用户画像,企业可实现市场定位、个性化推荐、精准广告、产品优化和风险控制。学习该领域需掌握多个技术栈,包括相关算法、工具及业务理解。
1767 4
|
Web App开发 API
在机器人流程自动化(RPA)中,判断网页或元素是否加载完成是一个重要的步骤
【2月更文挑战第24天】在机器人流程自动化(RPA)中,判断网页或元素是否加载完成是一个重要的步骤
748 6
|
监控 调度 Windows
带你读《智慧光网络:关键技术、应用实践和未来演进》——2.6 光波长选择及交叉技术(1)
带你读《智慧光网络:关键技术、应用实践和未来演进》——2.6 光波长选择及交叉技术(1)
|
JavaScript API 开发者
vue2源码系列-nextTick实现原理
nextTick实现 nextTick 作为 vue 的全局 api 之一,想必大家都非常熟悉。我们在上篇文章 深入Watcher 分析异步 watcher 的时候也是利用了 nextTick 来实现异步执行。今天我们就来分析分析 nextTick 的实现原理。
|
设计模式 存储 算法
Go设计模式(24)-访问者模式
访问者模式理解比较困难。可以认为对象开了一扇门,用来接收访问者,然后访问者便可在对象内部操作对象。简单来说,对象对访问者进行了授权。这样做能够实现对象和操作的解耦,职责更加单一。对象只管理自身,操作功能安置在访问者中。