QuickSort实现(C++模板函数,python实现)

快速排序(Quick sort) 一、简介 快速排序是(Quick sort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。 二、算法思路 快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。 大致步骤如下: 首先设置一个分界值也就是基准值又是也称为监视哨,通过该分界值将数据分割成两部分。 将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。一趟排序过后,左边部 阅读详情

0. 写作目的

好记性不如烂笔头。不同语言实现。(之前都是C++或者C语言实现的QuickSort,今天使用python3来实现)

1. 算法思想

对输入的数组 a[i , j] 进行排序:

1) 分解:将输入的数组分解成三部分—— a[i , k - 1], a[k] 和 a[k + 1 , j],使得a[i , k - 1]中的元素不大于(或者小于)a[k],a[k + 1, j]中的元素大于(或者不小于)a[k];

2) 递归求解:对于每部分递归调用快速排序算法,进行排序;

2. C++ 实现(模板函数)

template<class T>
int QuickSort_partition(T a[], int left, int right)
{
    T reference = a[left];
    while(left < right){
        while( (a[right] >= reference) && (left < right) ) right--;
        if( left < right ) a[left++] = a[right];
        while( (a[left] < reference) && (left < right) ) left++;
        if( left < right ) a[right--] = a[left];
    }
    a[right] = reference;
    return right;
}

template<class T>
void QuickSort(T a[], int left, int right)
{
    if(left < right){
        int middle_index = QuickSort_partition(a, left, right);
        QuickSort(a, left, middle_index - 1);
        QuickSort(a, middle_index + 1, right);
    }
}

3. python3实现

class QuickSortClass:
    def __init__(self, a:'list'):
        self.a = a

    def QuickSort_partition(self, left, right):
        reference = a[left]
        while (left < right):
            while ((a[right] >= reference) and (left < right)):
                right -= 1
            if (left < right):
                a[left] = a[right]
                left +=1
            while ((a[left] < reference) and (left < right)):
                left += 1
            if (left < right):
                a[right] = a[left]
                right -= 1
        a[right] = reference
        return right
    def QuickSort(self, left, right):
        if(left < right):
            middle_value_index = self.QuickSort_partition(left, right)
            self.QuickSort(left, middle_value_index - 1)
            self.QuickSort(middle_value_index + 1, right)

def test1():
    a = [3, 4, 13, 2, 13, 1]
    return a

if __name__ == "__main__":
    a = test1()
    print(a)
    quickSort = QuickSortClass(a)
    quickSort.QuickSort(0, len(a) - 1)
    print(quickSort.a)

 

[Reference]

[1] (博主的博客园,暂时不更新了)https://www.cnblogs.com/renchen/p/5935685.html

 

考研复试机试C++数据结构与算法模板大全 数据结构与算法是计算机科学的核心基础,其中线性表、树、图等基础数据结构在工程实践中广泛应用。通过STL等标准库实现的高效数据结构操作,能够显著提升代码执行效率。在考研机试等编程能力测试场景中,熟练掌握动态数组、链表、二叉搜索树等数据结构的工程实现尤为关键。本文提供的C++模板代码针对机试高频考点,包含动态数组的2倍扩容策略、链表的狸猫换太子删除法等23种数据结构实现,以及DFS的三种写法和背包问题的空间优化等18类算法模板,特别适合需要快速提升编程实战能力的考生。所有代码均通过边界测试验证,并附带时间复杂度 阅读详情

相关推荐

C++ 知识补充

向量(vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。

weixin_47059239的博客 2130

排序——快速排序(Quick sort)

概况 快速排序(Quick sort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。 算法思路 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: ......

努力中的老周的专栏 32万+

伪代码转C++工具实战:从算法思想到可执行代码的自动化生成

在算法学习和工程实践中,伪代码作为一种语言无关的算法描述工具,能帮助开发者专注于逻辑设计,而无需受限于具体编程语言的语法细节。其核心原理在于通过近似自然语言和标准化的控制结构(如IF、FOR、FUNCTION)来清晰表达算法流程。将伪代码自动转换为C++等高级语言,其技术价值在于能显著提升开发效率,减少手动翻译引入的语法错误,是连接算法设计与工程实现的关键桥梁。这一过程通常涉及自然语言处理(NLP)和编译原理中的词法分析、语法分析技术,通过构建解析器和代码生成器来实现。其应用场景广泛,包括算法教学、竞赛编程

weixin_34198881的博客 520

【C语言】QuickSort---快速排序

如果将最左边的值作为基准值(KEY)后,让left先走,那么相遇时的值会比KEY大,这时,如果交换KEY的值和下标,则。,我们就实现了KEY这个基准值的左边都比它要小,它的右边都比其要大了,也就是左小右大了。了吧,然后KEY的左子序列是不是都是比它小,右子序列都是比它大的。),当我们将最左边的值作为基准值时,就得让right先走了。这样,在其完成之后,其实也就是递归完成后,它的整体就成为了。,并且同时将KEY的下标也一并与相遇的数据。时,先将其共同指向的值和KEY指向的。的数据的时候停下来。

wzx0806的博客 1025

Ubuntu22.04下,用Fast-LIVO2+3DGS重建桌面小物件:从点云到高清模型的保姆级避坑实录

本文详细介绍了在Ubuntu22.04环境下,使用Fast-LIVO2与3DGS技术进行桌面小物件三维重建的完整流程。从环境配置、数据采集到点云-图像对齐和3DGS训练,提供了针对小物件优化的参数设置和避坑指南,帮助用户实现媲美商业扫描仪的高清模型重建效果。

weixin_30897233的博客 399

FPGA实现电机转速PID控制

通过纯RTL实现电机转速PID控制,包括电机编码器值读取,电机速度、正反转控制,PID算法,卡尔曼滤波,最终实现对电机速度进行控制,使其能够渐近设定的编码器目标值。

STATEABC的博客 7488

[算法]排序——快速排序(QuickSort)多种实现方式(C++实现)

快速排序是一种二叉树结构的交换排序算法,其核心思想是选取基准值(key),将序列分割成左小右大的两个子序列,再递归处理直至有序。递归实现主要有三种分区方法:Hoare版本(左右指针相向交换)、挖坑法(填坑式移动)和前后指针法(Lomuto分区)。非递归实现利用栈模拟递归过程,保存待排序区间下标。理想情况下时间复杂度为O(n log n),空间复杂度为O(log n);最坏情况退化为O(n²)。常用优化包括三数取中或随机取数避免最坏情况,以及小区间改用插入排序减少递归深度。

SUICIDEKILL的博客 2万+

水电站数字孪生:水力发电在可视化领域的应用

为智慧水坝领域提供了 B/S 架构的基于 WebGL 的图形引擎,与 GIS、粒子仿真、虚拟现实、边缘计算等技术相结合,融合多元业务系统数据,形成数字孪生界面,助力水利水电工程进一步提升数字化水平,乃至为整个工业领域添砖加瓦。

二三维数据可视化/数字孪生 2255

快速排序(Quicksort)详解

引言 这篇文章是我在2015年写的,当时正在看算法导论中关于快排的部分,因此写下文章总结一下当时对快排的理解。这几天我一直在review一下我先前写的blog,发现有些地方写的不算太好,还有一些错误的地方。今天我重新修改一下这篇文章,把错误的地方修正过来,并补充一些新的内容。 初识Quicksort Quicksort是一个分而治之的算法,它根据主元把一个大数组分成2个小数组:其中1个数

踩风火轮的乌龟 2万+

ARM和FPGA之间的通信(硬件原理图篇)

设计该开发板的初衷是为了学习,但也希望今后能扩展其功能,看到大家都在diy示波器,自己也非常冲动的想DIY一把,于是呼选了arm+fpga的方案,fpga主要用来实现数据的高速采样,而ARM则提供数据的显示,以及一些人机交互的功能。那么该方案中最重要的地方就是ARM和FPGA之间的通信如何实现了。在网上查了很多的资料,有说将FPGA作为ARM的一个外设,可以通过DMA的方式来直接访问;也有说把FP

屌yy的博客 5万+

YOLOv11 改进 - 注意力机制 | LS-YOLO MSFE 多尺度特征提取模块:并行分支结构增强多尺度感知,优化遥感与小目标检测

本文介绍了一种用于滑坡检测的模型LS-YOLO及其在YOLOv11中的结合应用。LS-YOLO首先构建多尺度滑坡数据集MSLD,为模型训练提供丰富数据。设计了基于高效通道注意力、平均池化和空间可分离卷积的多尺度特征提取模块MSFE,充分提取滑坡特征信息。在解耦头中采用膨胀卷积增加模型感受野。我们将MSFE模块集成进YOLOv11,替换部分原有模块。实验表明,改进后的YOLOv11在数据集中表现出色 。

魔改工程师的博客 870

C++模板底层原理与工程实践指南

C++模板是实现零开销抽象的核心机制,其本质是编译期类型编程——将类型作为参数参与代码生成。它通过函数模板、类模板和非类型模板参数,在编译阶段实例化专属代码,避免运行时开销与类型擦除。相比Java泛型或Python鸭子类型,C++模板提供更强的静态约束、性能保障与内存控制能力,广泛应用于STL容器、高性能中间件及嵌入式系统开发。理解模板实例化机制、SFINAE约束、特化规则及C++20 Concepts,是写出可维护、可复用、高性能通用代码的关键前提。

aodiyi6351的博客 423

【STM32实物】基于STM32+ESP32+手机APP设计的智能宠物喂食系统

本文以STM32单片机为主控MCU,配有压力传感器、温湿度传感器、光照强度传感器、蜂鸣器等,设计了一款可以远程控制的宠物智能喂食系统。用户可以通过APP下达指令,控制宠物的喂食。每天可以根据设置的数据进行精准喂食,成本相对较低的宠物喂食装置。该装置使用步进电机控制投食仓门的开闭,通过压力传感器和时钟系统控制每日的投喂量和投喂时间。每次投食后蜂鸣器会提醒宠物进食,树立每日定点进食的习惯。经测试得出,该设备确实能实现每日定时定量投喂。系统整体运行顺畅,所有预期功能得以实现。它非常适合解决宠物主人不在家时影响宠物

嵌入式阿齐Archie 2万+

用py14转译5个经典算法:阶乘、斐波那契到冒泡排序的完整教程

**py14 是一个 Python 到 C++14 转译器(transpiler)**,它能把你写的 Python 函数直接转成带模板类型推导的 C++14 代码。对于 Python 新手和想探索 C++ 的读者来说,这是一份从阶乘、斐波那契、冒泡排序到快速排序的完整上手教程,跟着做 10 分钟即可跑通第一个转译案例。 ## 什么是 py14:为什么 Python 能转成 C++14 py14

gitblog_00218的博客 200

120、ISP 驱动架构解析:从 V4L2 请求到 ISP 硬件的配置下发流程

本文以实际案例解析ISP驱动架构的V4L2到硬件配置下发流程。作者通过一个因内存共享导致画面闪烁的bug案例,详细剖析了用户空间参数通过V4L2结构体传递、驱动层拆包与硬件寄存器映射、时序同步机制等关键环节。特别强调深拷贝、dirty flag增量更新、shadow register等实现要点,并给出多路并发隔离、寄存器写入失败等典型问题的排查方法。文章建议开发者深入理解参数到寄存器的转换过程,推荐通过debugfs实时监控寄存器状态,避免过度依赖自动调试工具。全文以实践为导向,对ISP驱动开发具有直接指导

sundong_81的博客 159

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++模板编程:从通用算法到STL核心原理的深度解析

泛型编程是一种编程范式,其核心思想是通过参数化类型来编写独立于数据类型的通用代码。在C++中,这一理念主要通过模板技术实现,它允许程序员定义函数或类时使用占位符类型,编译器在编译期根据具体类型生成特化代码,从而实现类型安全的代码复用。这种编译期多态机制避免了运行时开销,是提升代码复用性和性能的关键技术。模板的技术价值在于它不仅是实现通用算法和数据结构的基础,更是现代C++标准库(STL)的构建基石,广泛应用于容器、算法和智能指针等核心组件。在工程实践中,模板通过函数模板实现通用算法,通过类模板构建如vect

weixin_34292402的博客 440

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++模板进阶:非类型参数与特化技术详解

C++模板作为泛型编程的核心机制,通过编译期代码生成实现类型安全的抽象。非类型模板参数允许将常量值作为模板参数传递,常用于固定大小容器和编译期计算场景。模板特化技术(全特化与偏特化)则能针对特定类型进行优化实现,是标准库中vector<bool>等特殊实现的基础。这些进阶特性与SFINAE、变参模板等技术共同构成了现代C++模板元编程体系,在性能敏感领域如数学库、容器实现中具有重要价值。掌握模板特化与非类型参数的使用,能够显著提升代码的灵活性和运行效率。

weixin_34226706的博客 316

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Qwopus3.6-27B-Coder与llama.cpp集成:高效本地推理的完整配置指南

Qwopus3.6-27B-Coder-Compat-MTP-GGUF是一款专为本地高效推理设计的多模态AI模型,通过与llama.cpp框架集成,实现了在个人设备上的高性能代码生成与工具调用能力。本文将详细介绍如何配置这一强大组合,让你轻松拥有专业级本地AI编码助手。 ## 🚀 为什么选择Qwopus3.6-27B-Coder与llama.cpp? Qwopus3.6-27B-Coder作

gitblog_00716的博客 375

C++用户定义函数:内联、默认参数与重载的工程实践

用户定义函数是C++程序结构的基础单元,其核心在于建立编译期类型契约,保障强类型安全与运行时效率。通过内联函数减少调用开销、默认参数降低API使用门槛、函数重载实现静态多态适配,三者共同构成灵活而严谨的函数设计体系。这些机制广泛应用于c++小游戏开发、c++八大排序算法实现、竞赛题如【例75.3】谁拿了最多奖学金等真实场景,支撑模块解耦、性能优化与接口统一。掌握其原理与避坑要点,是跨越c++入门迈向工业级编码的关键跃迁。

weixin_30945039的博客 331

C++多态机制解析:从虚函数表到设计模式应用

面向对象编程中的多态性是实现代码灵活扩展的核心机制,C++通过虚函数表(vtable)实现运行时多态。虚函数表存储了类的虚函数地址,对象通过vptr指针访问对应实现,这种间接调用机制虽然带来一定性能开销,但为设计模式如策略模式、工厂模式提供了基础支持。在游戏开发中,多态实现了不同游戏对象的统一管理;在标准库中,IO流和异常处理都依赖多态体系。现代C++通过override/final关键字增强了多态安全性,而类型擦除技术则扩展了多态的应用场景。理解虚函数表工作原理和多态性能特征,是编写高效C++程序的关键。

weixin_34321753的博客 525

C++用户定义函数设计:内联、默认参数与重载的工程实践

C++用户定义函数不仅是语法结构,更是接口契约与资源管理的核心载体。其设计原理根植于内存模型(栈/堆生命周期)、类型系统(重载解析与隐式转换)和编译优化机制(内联决策、默认参数求值时机)。技术价值体现在性能可控性(避免拷贝、减少调用开销)、接口健壮性(const正确性、异常安全)与演进弹性(签名兼容、扩展缝预留)。典型应用场景覆盖高频工具函数(如日志、字符串分割)、多态接口抽象(图形绘制、序列化)及异步回调封装(Lambda捕获策略)。本文聚焦内联函数的编译器信任机制、默认参数的责任转移逻辑,以及函数重载在

weixin_33910137的博客 381

AI编程助手在C++开发中的实战应用:从环境配置到算法实现

AI辅助编程已成为现代软件开发的重要趋势,它通过深度学习模型理解代码上下文,提供智能补全和代码生成能力。其技术原理基于大规模代码库训练,能够识别编程模式,提升开发效率。在工程实践中,AI编程助手尤其适用于解决算法实现、多线程编程和库集成等常见问题。例如,在C++开发中,开发者可以利用AI快速生成经典算法如中缀表达式转后缀表达式的实现,或辅助构建线程安全队列等并发数据结构。结合OpenCV等库时,AI能加速图像处理管道的搭建。通过合理配置开发环境并掌握精准提问技巧,开发者可以将AI作为高效的协作伙伴,应对C+

weixin_33910137的博客 655

C++算法实践:从理论到工业级实现的四个维度与优化技巧

算法是计算机科学的核心,它定义了解决问题的逻辑步骤和计算效率。在C++编程中,实现一个算法不仅关乎逻辑正确性,更涉及性能、健壮性、可维护性和可测试性等多维度工程实践。理解时间与空间复杂度是基础,而深入内存访问模式、缓存友好性、并发并行化等底层原理,才能充分发挥C++的硬件掌控力。通过RAII(资源获取即初始化)等现代C++特性管理资源,结合智能指针避免内存泄漏,是构建健壮软件的关键。这些技术价值最终体现在高性能后台服务、游戏引擎、实时系统等对效率和稳定性要求苛刻的应用场景中。本文以快速排序为例,探讨如何将教

weixin_33722405的博客 444

工业级排序算法实战:Timsort、Introsort与Radix Sort原理及调优

排序算法是数据处理的底层基石,其性能不仅取决于时间复杂度,更受内存访问模式、CPU缓存行为、分支预测效率和硬件特性深度制约。Timsort凭借自适应run识别与稳定合并策略,在局部有序数据(如日志、时序流)中实现近线性性能;Introsort通过递归深度监控、三数取中pivot与小数组插入优化,为快排注入确定性保障;Radix Sort则绕过比较操作,在整数、IP、字符串等固定键长场景下突破O(n log n)理论瓶颈。这些工业级实现广泛应用于Java/Python排序库、Linux内核、PostgreSQ

weixin_30861797的博客 369

编程语言难度排名:从Python到汇编,如何选择最适合你的学习路径?

编程语言作为软件开发的基石,其学习难度直接影响开发者的入门效率和职业发展。不同语言的设计哲学、语法特性和应用场景决定了其学习曲线的陡峭程度。从语法亲和力、编程范式、生态工具链、调试成本和社区资源五个维度综合评估,可以构建一个务实的“难度测量仪”。例如,Python以其简洁语法和丰富库生态成为新手友好型语言,而JavaScript则因异步编程和快速迭代的框架生态增加了实践复杂度。对于追求高性能和系统级控制的开发者,C++和Rust提供了强大能力,但也带来了手动内存管理和所有权模型等高级概念的学习门槛。理解这些

weixin_30326741的博客 428
上一篇: 有趣的编程(一)——海盗分金币问题如何编程求解
下一篇: C++深入理解(一)——自定义类中重载运算符返回引用以及连续赋值的机制理解
holmes_MX
博客等级 码龄9年 53粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值