首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

快速排序递归详解

01 — 前言 我们熟知常见排序算法有:冒泡排序、选择排序、归并排序、插入排序快速排序等;每种都有其不同特点以及解法,并且每种排序都可以找到不同算法思路来解答,拿快速排序来讲,有递归和非递归解法...,以下就讲讲递归快速排序解法。...02 — 快速排序概念 快速排序(Quick Sort)是对冒泡排序一种改进。...从快速排序步骤我们不难发现:快速排序其实使用是分而治之思想,它排序过程是一个递归调用过程。...} 04 — 总结 采用分而治之递归思想是解决快速排序一个比较好方案,递归思想不止是用到排序里面,也可以用于查找里面,比如当需要在大数据量之中查找某个某个值时,也可以运用这种思想,从而达到提升查询效率

38810

快速排序 数组+递归实现

快速排序 数组+递归实现 问题描述: 给定N个元素数组arr[N],需要把数组arr数排成非递减次序并输出. 基本思想: 1....用一个自定义分割方法split()选取用来作分割元素(也称为partition主元),最简单分割方法是选定待排范围第一个数为partition主元,一趟快排完成后,主元e是数组arr第i个元素...使用两个跟踪变量(forward和backward),递归地对从i到backward采用快速排序方法quickSort(),并递归地对从forward到i采用快速排序方法quickSort(); 3...注: 数组arr=L区间(主元e左边部分)+主元e+U(未排序部分)+R(主元e右边部分),其中区间U是区间L与区间R夹住部分,每次递归都是让U缩小,直到为0,此时快排结束......e左侧元素排序 quickSort(arr, part_pos+1, backward); // 递归地给主元e右侧元素排序 } int split(int arr[], int forward

63120
您找到你想要的搜索结果了吗?
是的
没有找到

快速排序详解(递归实现与非递归实现)

一、快速排序基本思想 快速排序是Hoare于1962年提出一种二叉树结构交换排序方法,其基本思想为:任取待排序元素序列某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值...div); // 递归排[div+1, right) QuickSort(array, div+1, right); } 上述为快速排序递归实现主框架,会发现与二叉树前序遍历规则非常像,先取中间...QuickSort(a, left, keyi-1); QuickSort(a, keyi+1, right); //不断递归左区间和右区间 } 四、快速排序优化实现 4.1快排特殊情况 上面的写法面对绝大多数情况排序已经可以实现时间复杂度接近...快排使用到了递归思想和方法,但是递归如果递归太深的话就会有爆栈风险,所以在这里也介绍一下快速排序递归实现方法。...快速排序整体综合性能和使用场景都是比较好,所以才敢叫快速排序 2. 时间复杂度:O(N*logN) 3. 空间复杂度:O(logN) 4. 稳定性:不稳定

9510

递归与分治之快速排序

分治法就是把一个大问题分解为多个类型相同子问题,最后把这些子问题解合并起来就是问题解。 快速排序(Quicksort)是对冒泡排序一种改进,采用了分治思想。...快排基本思想: 通过一趟排序将要排序数据分割成独立两部分,其中一部分所有数据都比另外一部分所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,当待排序列数据个数为...具体算法步骤: 对于待排序列,在一趟排序前,从待排序随机选取一个数据作为枢轴量, 使所有小于枢轴量数据位于其左面,所有大于枢轴量数据位于其右面, 然后再依次用该方法对其左面、右面的序列进行排序。...当待排序列个数为1时,代表该部分已经完成排序递归可完成整个序列排序。...python代码实现如下: 1 # coding=gbk 2 import random 3 import time 4 5 __author__ = 'ice' 6 7 8 def

80360

快速排序:高效分割与递归排序领域王者算法

文章目录 前言 一、快速排序介绍 二、快速排序实现 2.1 hoare版本 为什么每次相遇位置都比key要小 2.2 挖坑法 2.3 前后指针版本 三、快速排序优化 快排最坏情况 3.1 三数取...3.2 递归到小子区间时使用插入排序 3.3 快速排序最终代码 四、快速排序总结 快速排序特性总结: 一、快速排序介绍 快速排序是一种基于分治思想高效排序算法,由Tony Hoare于1960...二、快速排序实现 快速排序是一种基于分治思想高效排序算法其核心就是每次找到最中间位置然后再进行递归继续找到最中间位置然后再分割一直分割到只剩一个数时候那么这个数组就是有序了。...每次找到中间值之后利用分治思想,大问题化为小问题 然后递归进行排序递归完成时每个中间值都找到就是排序时候 而要搞定一个排序首先最先解决就是其中单趟排序下面就是各位大佬想出来单趟排序方法: 先把部分单趟排序搞出来后面来实现整体排序就简单多了...和 right 交换 并记录下新坑位 hole 代码演示: //快速排序挖坑法 int PartSort2(int* a, int begin, int end) { //三数取 int midi

12210

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

前言 快排性能和各个综合性能都是排序梯队里面最顶尖,虽然我们掌握递归方法来快速实现快排,但是递归堆栈消耗太大了为此我们专门还优化了快排。...文章目录 前言 一、为什么要掌握非递归 二、栈区和堆区大小对比 三、非递归实现快排思想 3.1 利用人工栈来实现递归 3.2 实现代码 四、快速排序总结 快速排序特性总结: 一、为什么要掌握非递归...还能来以此来检验我们递归能力 在有些场景限制递归深度时候,例如在嵌入式系统或对递归深度有限制环境,非递归就是我们必须掌握了使得我们算法可以应用于各种场景 二、栈区和堆区大小对比 为什么我们一直在说要避免栈区开调用开销...其实是因为在操作系统概念栈是一快用来快速存储区域 在32位操作系统栈一般内存只有 10M 而堆内存划分却达到了 2G 三、非递归实现快排思想 非递归其实就是利用迭代思想来替换递归过程...快速排序特性总结: 快速排序整体综合性能和使用场景都是比较好,所以才敢叫快速排序 时间复杂度:O(N*logN) 空间复杂度:O(logN) 稳定性:不稳定

13910

快速排序 Python

碎碎念念 快速排序基本思想是:首先找一个基准数,一般选第一个数或者最后一个数作为基准数,然后先把这一串数以基准数为界限分成两部分,一部分比基准数小,另一部分比基准数大。...然后用分治法思想,进行递归调用,对每一部分继续操作下去,直到每一部分只剩下一个数。 代码 def fast(number,first,last):#从小到大排序。...if first>=last:#相同说明这小部分一排序完毕。...=j:#从两边出发,比基准数小扔一边,比基准数大扔另一边 while j>i and number[j]>=standard:#从右边出发,目的是找到比基准数小数...fast(number,first,i-1)#继续排基准数左边 fast(number,i+1,last)#继续排基准数右边 number=[3,6,5,8,1,4,7,9,2,0

11020

Python|快速排序

1 快速排序方法 取一个元素s,将比s小元素放在s左边,将比s大元素放在s右边;就是将数组划分成两部分,左小右大,然后将分好两个数组递归继续执行上述操作,直到排序完毕为止。...递归执行上述步骤;在对划分左右进行排序,直到排序完毕。 左边:left=0,right=返回left-1 右边:left=返回left,right=数组长度 ?...2 代码演示 # 快速排序 def passt(li, left, right): s = li[left] # 该处 我们始终以第一个元素为s,即所取元素 while left...] quick_sorted(li, 0, len(li)-1) print(li) 3 总结 本篇博客主要讲述了快排排序方法,及如何用python代码来实现。...快速排序相对于其他排序方法而言,主要突出了一个“快”字,可以更快将数组元素进行排序。 END 主 编 | 王文星 责 编 | W Z Y

32520

python快速排序

// python小程序 // 晚上没事儿干,用python写了个快排小程序,分享出来看看: 快速排序: #!.../usr/bin/env python # -*- coding:utf8 -*- from random import randrange, shuffle ''' 基本思想: 通过一趟排序将要排序数据分割成独立两部分...:分割点左边都是比它小数,右边都是比它大数。...基本流程:通过一趟排序将要排序数据分割成独立两部分, 其中一部分所有数据都比另外一部分所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行,以此达到整个数据变成有序序列...,则把end数字复制给start array[start] = array[end] # 同样方法比较前半区 while start

34110

【C语言数据结构】排序快速排序及多种优化|递归及非递归版本)

今日更新了快速排序内容 欢迎大家关注点赞收藏⭐️留言 交换排序 快速排序 快排过程图如下: hoare版代码呈现 void QuickSort(int* a, int begin,int...直到left与right相遇,就交换keyi和left对应值。这是单趟,后续过程重复,可以思考二叉树递归过程,快排递归与其相似(见下图)。 下图中,划红线地方是容易出错地方。...快排优化 三数取中法选key 递归到小子区间时,可以考虑使用插入排序 三数取中法 快排对于有序数据,效率不是很高。 如上图,我们前面的快排是固定选key,也就是左边第一幅图,效率很低。...但不同版本,单趟排序结果可能会不同。...先模拟递归左边,像二叉树递归那样,先入右边数,再入左边,这样出时候就先出左边,然后就可以模拟先往左边递归了。

10910

Python实现快速排序

这可能就是一些额外知识补充给带给我福利吧。 第二个是对于数据结构设计上和算法密切相关,让我突然理解了数据库设计方式。...记得大学看一个算法,花了好几个小时,结果上课时候,老师花了不到五分钟就讲完了,然后脑袋一片空白,记得当时学快速排序时候,感觉这个算法应该是很复杂,感觉理解了,但是很快就忘记了。...第四个是对递归理解。今天看了之后算是刷新自己认知。里面有句话说好:递归将人分为三个截然不同阵营,恨它,爱它,和恨了几年又爱上它。我确切说也是属于第三种。...使用循环,程序性能可能而更好,但是使用递归,程序更容易理解。 对于快速排序,算法思考方式就是由简到难。...这样一来,三个数,四个数都是如此思路。我们就可以使用递归来处理了。

93470

基于Python快速排序

快速排序(Quick Sort)是一种高效排序算法,它采用了分而治之(Divide and Conquer)思想。...以下是一个简单快速排序 Python 实现:def quick_sort(arr): if len(arr) <= 1: return arr pivot =...数组:包含所有等于基准元素(这一步是可选,但为了保持算法稳定性,我们通常也会将其包括在内)。右数组:包含所有大于基准元素。递归排序:对左数组和右数组分别进行快速排序。...注意,由于我们已经将等于基准元素单独拿出来了,所以在对左右数组进行排序时,不需要再考虑这些元素。合并:将已排序左数组、数组和右数组合并起来,得到完全排序数组。...递归基准:快速排序递归,每次递归都会选择一个新基准,并重复上述步骤,直到数组被完全排序。注意:上述代码是一个简单快速排序实现,主要用于教学目的。

12820

快速排序python实现

快速排序python实现 快速排序 快速排序实现同样使用分治法,它原理是从序列中选择一个值作为基准值,然后分成比基准值小序列集合和比基准值小序列集合和与基准值相等序列集合。...每次分割都是以序列第一个值作为基准值,经过拆分后自然就变成了有顺序 具体算法 def quick_sort(s): """快速排序,s为列表""" # 结束条件 if len...s.extend(R) if __name__ == '__main__': s = [1, 7, 3, 5, 4] quick_sort(s) print(s) 代码实现是列表快速排序...就地快速排序 上面的快排使用了L,E,R存储临时序列,这样会占用内存,使用就地快速排序方式可以在原序列上完成排序,减少了内存使用 def inplace_quick_sort(s,a,b):...然后再进行递归调用两个序列​

51520

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券