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

快速排序递归详解

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

39110

快速排序 数组+递归实现

快速排序 数组+递归实现 问题描述: 给定N个元素的数组arr[N],需要把数组arr中的数排成非递减的次序并输出. 基本思想: 1....使用两个跟踪变量(forward和backward),递归地对从i到backward采用快速排序方法quickSort(),并递归地对从forward到i采用快速排序方法quickSort(); 3...注: 数组arr=L区间(主元e左边的部分)+主元e+U(未排序部分)+R(主元e右边的部分),其中区间U是区间L与区间R夹住的部分,每次递归都是让U缩小,直到为0,此时快排结束......+) { printf("%d ",arr[idx]); } printf("\n"); quickSort(arr, forward, part_pos-1); // 递归地给主元...e左侧元素排序 quickSort(arr, part_pos+1, backward); // 递归地给主元e右侧元素排序 } int split(int arr[], int forward

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

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

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

11110

递归与分治之快速排序

快速排序(Quicksort)是对冒泡排序的一种改进,采用了分治的思想。...快排的基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,当待排序列数据个数为...具体算法步骤: 对于待排序列,在一趟排序前,从待排序列中随机选取一个数据作为枢轴量, 使所有小于枢轴量的数据位于其左面,所有大于枢轴量的数据位于其右面, 然后再依次用该方法对其左面、右面的序列进行排序。...当待排序列个数为1时,代表该部分已经完成排序递归可完成整个序列的排序

81060

快速排序Java实现_快速排序实现java

高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。...细心的同学可能已经发现,快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。下面上个霸气的图来描述下整个算法的处理过程。 这是为什么呢?...快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。...因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。我们后面还会遇到“二分”思想,到时候再聊。...quickSort(arr, low, j-1); //递归调用右半数组 quickSort(arr, j+1, high); }

1.3K10

C语言快速排序(非递归)图文详解

前言:   上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?...答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈来模拟实现递归的过程。...(注意下面的数字代表下标) 好,接下来开始用栈模拟递归:(图中栈中的数字均表示下标) 1.第一次入栈: 将整个数组入栈,也就是下标为0-8 2.第一次出栈: 每次出栈,对出栈的下标区间进行一次部分排序,...然后再将key的左区间和右区间分别入栈,也就是0-3和5-8 3.第二次出栈: 根据栈的性质后入先出,所以我们让5-8出栈: 跟上面一样,每次出栈对相应区间进行一次部分排序排序完如下图: 因为在对这个区间进行部分排序时...现在就不难感受出,这其实是在模拟递归的过程。

6110

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

3.2 递归到小的子区间时使用插入排序 3.3 快速排序的最终代码 四、快速排序的总结 快速排序的特性总结: 一、快速排序的介绍 快速排序是一种基于分治思想的高效排序算法,由Tony Hoare于1960...二、快速排序的实现 快速排序是一种基于分治思想的高效排序算法其核心就是每次找到最中间的位置然后再进行递归继续找到最中间的位置然后再分割一直分割到只剩一个数的时候那么这个数组就是有序了。...每次找到中间值之后利用分治思想,大问题化为小问题 然后递归进行排序递归完成时每个中间值都找到就是排序好的时候 而要搞定一个排序首先最先解决的就是其中单趟排序下面就是各位大佬想出来的单趟排序方法: 先把部分的单趟排序搞出来后面来实现整体排序就简单多了...因为如果有很多的数据进行排序的话 快排的特性是每次到找到中间值然后再递归所以但递归到了10这个区间的时候就大致有序了,而插入排序对有序数组排序最快是 O(N) 所以我们选择当区间为 10 的时候采用插入排序来进行排序...这里就可以看到递归的栈区消耗优化达到了惊人 %80 代码演示: //快速排序 void QuickSort(int* a, int begin, int end) { if (begin >= end

14610

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

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

13010

java实现快速排序图解_快速排序图文详解

快速排序 快速排序法介绍 图解 代码理解 快速排序算法性能分析 算法图 快速排序法介绍 快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将 要排序的数据分割成独立的两部分...,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。...快速排序的时间性能取决于快速排序递归的深度。...在最优的情况下,Partition每次都划分得很均匀,如果排序n个数值,那么递归树的深度就为.log2n.+1(.x.表示不大于x的最大整数),即仅需递归log2n次,其时间复杂度为O(nlogn) 在最坏的情况下...,待排序的序列为正序或者逆序,每次划分只得到一个比上一次划分少一个数值的子序列,此时需要执行n-1次递归调用且第i次划分需要经过n-i次比较才能得到第i个数值,其时间复杂度为O(n^2) 算法图 口诀:

45820

java冒泡排序快速排序

下面我们来看看java中的Arrays.sort(int []a)方法是怎么实现的。 ---- 二、快速排序 java中Arrays.sort使用了两种排序方法,快速排序和优化的合并排序。...快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序。 使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的。...1.实现原理 java1.7之后的版本,开始用双轴快排取代了以前的排序算法,现在只实现了8种基本数据类型性的双轴快排,对象的排序在1.7中还在用老式的,不过都标了过时,估计以后版本中就会被新的双轴快排取代了...双轴快排的基本原理是取两个pivot,所有比pivot1小的放到最左边,比pivot2大的放到最右边,然后递归下去,就可以把两端的元素完成排序,之后处理中间部分,中间部分如果过大就继续递归用这种方式继续分割...尽管插入排序的时间复杂度为0(n^2),但是当数组元素较少时,插入排序优于快速排序,因为这时快速排序递归操作影响性能。   2)较好的选择了划分元(基准元素)。

1.3K30

搞定Java快速排序

简介 快速排序(Quicksort),简称快排,是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1960年提出。...它的基本思想分治法:即通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以使用递归实现。...二 算法思想 快速排序算法的核心思想是分治法,先比大小,然后分区。下面我们通过生活中的一个例子来解释一下这个算法思想。...我们希望按照他们的年纪从小到达重新进行排列,快速排序的思想是,选一个人的年纪作为基准数,这里选21,然后让剩下的人分别和21比较,小于21的都站在他的左边,大于21的都站在他的右边,通过21把这些人分成了两部分...if (start > low){ sort(array, low, start - 1); } //右边递归调用 if (end < high){ sort(array, end + 1, high

59541

快速排序java实现)

高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。...细心的同学可能已经发现,快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。下面上个霸气的图来描述下整个算法的处理过程。 这是为什么呢?...快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。...因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。我们后面还会遇到“二分”思想,到时候再聊。...quickSort(arr, low, j-1); //递归调用右半数组 quickSort(arr, j+1, high); }

56610

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

前言 快排的性能和各个综合性能都是排序梯队里面最顶尖的,虽然我们掌握递归的方法来快速实现快排,但是递归堆栈的消耗太大了为此我们专门还优化了快排。...文章目录 前言 一、为什么要掌握非递归 二、栈区和堆区的大小对比 三、非递归实现快排的思想 3.1 利用人工栈来实现递归 3.2 实现代码 四、快速排序总结 快速排序的特性总结: 一、为什么要掌握非递归...既然是利用人工栈那么我们首先肯定是先来创建一个栈来把第一个区间录入进去: 然后进行循环当栈位空的时候说明我们的数组就递归完了 3.2 实现代码 代码演示: // 快速排序递归实现 void QuickSortNonR...(left < keyi - 1) { STPush(&st, keyi - 1); STPush(&st, left); } } STDestory(&st); } 四、快速排序总结...快速排序的特性总结: 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序 时间复杂度:O(N*logN) 空间复杂度:O(logN) 稳定性:不稳定

14910
领券