首页 > 编程语言 >排序算法 - 快速排序

排序算法 - 快速排序

时间:2024-10-17 22:31:52浏览次数:1  
标签:基准 元素 算法 left pivot 排序 快速 指针

排序算法 - 快速排序

   概要

   快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序是一种基于分而治之的排序算法。

   它的基本思想是: 选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

   基准元素的选择,以及元素的交换,都是快速排序的核心问题。    

   一、基准元素的选择

   最简单的方式是选择第1个元素。但是针对特殊情况比如原本逆序的数列,期望排列成顺序数列,整个数列并没有被分成两半。如何避免这种情况?

   解决办法:随机选择一个基准元素,并且让基准元素和数列首元素交换位置。

   二、元素的交换

   选定了基准元素以后,我们要做的就是把其他元素中小于基准元素的都交换到基准元素一边,大于基准元素的都交换到基准元素的另一边。具体实现有两种方法。

   1. 双边循环法

   选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右两个元素。

   接下来进行第1次循环,从right指针开始,让指针所指向的元素和基准元素做比较,如果大于pivot,则指针向左移动。如果小于pivot,则right指针停止移动,切换到left指针。

   轮到left指针,让指针所指向的元素和基准元素做比较,如果小于等于pivot,则指针向右移动。如果大于pivot,则left指针停止移动。

   让left和right指针所指向的元素进行交换。

   接下来进入第2次循环,重新切换到right指针,向左移动。按照这个思路继续往下,

   最后,等到left指针和right指针重合的时候,将left指针所指向的元素和基准元素所在位置的元素进行交换。返回left指针所在的位置,这个就是基准元素的位置,根据基准元素,分成两部分递归排序。

   2. 单边循环法

    双边循环法从数组两边交替遍历元素,虽然更加直观,但是代码实现相对繁琐,而单边循环法则简单得多,只从数组的一边对元素进行遍历和交换。

    mark指针代表小于基准元素的区域边界。
    具体实现过程:

    从基准元素的下一个位置开始遍历数组。

    如果遍历到的元素值大于等于基准元素时,就继续往后遍历

    如果遍历到的元素小于基准元素值时,则需要做两件事:

    1)将mark指针右移1位,因为小于pivot的区域边界增大

    2)让最新遍历到的元素和mark指针所在位置的元素交换位置,因为最新遍历的元素归属于小于pivot的区域。

    最后,将pivot元素交换到mark指针所在位置,返回mark指针所在的位置,这个就是基准元素的位置,根据基准元素,分成两部分递归排序。这一轮宣告结束。

标签:基准,元素,算法,left,pivot,排序,快速,指针
From: https://www.cnblogs.com/hld123/p/18473258

相关文章

  • 【算法】C++中的二分查找
    ......
  • 使用LLaMA-Factory快速训练自己的专用大模型
    转自:萤火架构本文聊聊LLama-Factory,它是一个开源框架,这里头可以找到一系列预制的组件和模板,让你不用从零开始,就能训练出自己的语言模型(微调)。不管是聊天机器人,还是文章生成器,甚至是问答系统,都能搞定。而且,LLama-Factory还支持多种框架和数据集,这意味着你可以根据项目需求灵......
  • 代码随想录算法训练营 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和,392.判断
    1143.最长公共子序列题目链接:1143.最长公共子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰最长公共子序列日期:2024-10-17想法:这里的子序列不要求连续了,dp[i][j]要表示为在text1[0,i-1]和text2[0,j-1]的范围里,最长的公共子序列长度,-1同样是为了初始化方便,如果te......
  • 吴恩达深度学习笔记(4)---加速神经网络训练速度的优化算法
    机器学习的应用是一个高度依赖经验,不断重复的过程,需要训练很多模型才能找到一个确实好用的。小批量梯度下降算法:矢量化可以有效计算m个算例而不需要for循环,因此我们需要将所有的训练样例放入巨型矩阵中。但是当数据量超大时,计算时间仍需很久,可以考虑将训练集分为微小的训练集......
  • (算法)最⻓湍流⼦数组————<动态规划>
    1.题⽬链接:978.最⻓湍流⼦数组2.题⽬描述:3.解法(动态规划):算法思路:1.状态表⽰:我们先尝试定义状态表⽰为:dp[i]表⽰「以i位置为结尾的最⻓湍流数组的⻓度」。 但是,问题来了,如果状态表⽰这样定义的话,以i位置为结尾的最⻓湍流数组的⻓度我们没法从之前的状态推导出......
  • (算法)等差数列划分————<动态规划>
    1.题⽬链接:413.等差数列划分2.题⽬描述:3.解法(动态规划):算法思路:1.状态表⽰:由于我们的研究对象是「⼀段连续的区间」,如果我们状态表⽰定义成[0,i]区间内⼀共有多少等差数列,那么我们在分析dp[i]的状态转移时,会⽆从下⼿,因为我们不清楚前⾯那么多的「等差数列都在什......
  • 图论day64 :最短路径算法 | SPFA(Bellman_ford的队列优化版)、城市间货物运输 I、Ⅱ、Ⅲ
    图论day64:最短路径算法|SPFA(Bellman_ford的队列优化版)、94.城市间货物运输I(卡码网)【SPFA算法+邻接表优化】、95.城市间货物运输II(判断负权回路)、96.城市间货物运输III【已知有负权回路,该如何计算】、Bellman_ford算法思维导图汇总SPFA(Bellman_ford的队列优化版)94......
  • 从单细胞和空间转录组学推断模式驱动的细胞间流动(Flowsig)--生信算法笔记
    **Inferringpattern-drivingintercellularflowsfromsingle-cellandspatialtranscriptomics**Almet,A.A.,Tsai,YC.,Watanabe,M.etal.Inferringpattern-drivingintercellularflowsfromsingle-cellandspatialtranscriptomics.NatMethods21,1806......
  • 大数据传播模型与算法——影响力最大化
    【大数据网络传播模型和算法-陈卫】——影响力最大化【持续更新】本人当前研究方向为影响力最大化(基于机器学习的组合优化算法)。目前在学习陈卫编著的《大数据传播模型与算法》,该系列会定期分享影响力最大化的学习内容(持续更新…),希望大家能够一起交流学习!前言什么是影响?......
  • 【关联规则挖掘算法‌】基于模式增长的关联规则挖掘算法
    目录一、基于模式增长的关联规则挖掘算法概述二、基于模式增长的关联规则挖掘算法优缺点和改进2.1  基于模式增长的关联规则挖掘算法优点2.2  基于模式增长的关联规则挖掘算法缺点2.3  基于模式增长的关联规则挖掘算法改进三、基于模式增长的关联规则挖掘算法编程......