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

快速排序【hoare版本】【挖坑法】【双指针法】(数据结构)

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值...下图为单趟快速排序的过程 程序源代码 //单趟排序 int PartSort1(int* a, int begin, int end) { int key = a[begin];//选取左边做key...(选取左边值做key同理) 2.注意在移动begin和end的时候每次都需要判断begin排序 优化        经过分析我们发现:快速排序的最坏情况是每次选择的基准元素都是当前子数组的最大或最小值...在这种情况下,算法的时间复杂度接近于O(N*N),快速排序也就没有什么优势了,因此我们要做出优化。         为避免选取到最大值或者最小值,出现了三数取中法。...1 , right] QuickSort(a, left, div - 1); QuickSort(a, div + 1, right); }  二、挖坑法        挖坑法是最主流的快速排序的方法

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

    算法导论第七章快速排序

    一、快速排序概述 关于快速排序,我之前写过两篇文章,一篇是写VC库中的快排函数,另一篇是写了快排的三种实现方法。...现在再一次看算法导论,发现对快速排序又有了些新的认识,总结如下: (1)、快速排序最坏情况下的时间复杂度为O(n^2),虽然最坏情况下性能较差,但快排在实际应用中是最佳选择。...原因在于:其平均性能较好,为O(nlgn),且O(nlgn)记号中的常数因子较小,而且是稳定排序。 (2)、快速排序的思想和合并排序一样,即分治。...c、对分出来的两个分区分别执行上一步,直到区间只有一个数为止。 二、Hoare(霍尔)排序 快速排序首先由 C. A. R....2、中位数优化法: 所谓“三数取中”是指,从子数组中随机选出三个元素,取其中间数作为主元,这算是前面随机化版本的升级版。虽然是升级版,但是也只能影响快速排序时间复杂度O(nlgn)的常数因子。

    712100

    【数据结构与算法】快速排序万字全攻略:hoare版本、挖坑法、前后指针法、优化版、非递归实现

    这些优化策略包括但不限于:基准值的选择(如随机选择、三数中值分割等)、尾递归优化、小数组优化(当子数组较小时改用插入排序等更高效的算法)、并行快速排序等。...优势与特点: Hoare版本的快速排序在分区时,begin和end指针是同时从数组的两端向中间移动,这有助于减少数据移动的次数,尤其是在数组已经部分有序的情况下。...注意:在实际应用中,快速排序的性能很大程度上取决于基准值的选择和分区策略。Hoare版本的分区策略相对简单,但在某些情况下可能不是最优的。...平均情况(O(n log n)): 对于随机排列的数组,快速排序的平均时间复杂度也是O(n log n)。...虽然存在最坏情况的风险,但通过随机选择分区点或使用三数取中等策略,可以大大降低遇到最坏情况的可能性。

    20410

    快速排序图解(两种思想)

    七大排序之快速排序 文章目录 七大排序之快速排序 前言 一、《算法导论》中的分区思想 1.1 算法思想 1.2 代码实现 二、Hoare挖坑法 2.1 算法思想 2.2 代码实现 三、算法分析 四、注意事项...动图如下: 1.1 算法思想 快速排序是20世纪最伟大的算法之一 核心的思路就是分区 分区值:默认选择最左侧元素pivot(当然也可以随机选择) 从无序区间选择一个值作为分界点pivot开始扫描原集合...quickSortInternal(arr,p + 1,r); } private static int partition(int[] arr, int l, int r) { // 1.优化1.使用一个随机位置作为分区点...+ 1); } } private static int partition(int[] arr, int l, int r) { // 1.优化1.使用一个随机位置作为分区点...每次递归时选择数组中任意一个元素作为分区点 优化: 关于分区点的选择。使用随机数随机取一个数组索引的元素作为分区点,基本上不可能出现单支树的情况,避免近乎有序数组上快排退化问题。

    54740

    【初阶数据结构与算法】八大排序算法之交换排序(冒泡排序,快速排序---hoare、挖坑法、lomuto双指针3种版本)

    flag = 0; } } //如果没有发生交换flag = 1,退出循环 //发生了交换flag = 0,不会跳出循环 if (flag) break; } } 我们来使用一下冒泡排序...,具体原因我们后面分析 二、快速排序简介及其大致框架    快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两...看起来非常类似于二叉树的前序遍历,我们简单画图演示一下:    如上图的操作就像二叉树的前序遍历一样,先对根进行处理,然后对左右进行处理,它的代码也很像二叉树的前序遍历,我们按照上面的思路写出快排的大致框架: //快速排序...keyi和right位置的元素交换 Swap(&arr[keyi], &arr[right]); //由于right指向的就是调整后的基准值,直接返回即可 return right; } 接着我们就使用这个版本的快排来排序试试...() { TestOP(); return 0; }    接着我们来运行一下代码,注意要把模式调为Release,这样才能测试出它们的真实性能,如下:    可以看到10万个随机数

    13010

    使用 Go 实现快速排序

    ), 但是快速排序也是最不容易实现的排序算法之一 。...快速排序由C. A. R. Hoare在1962年提出。...这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。...快速排序平均时间复杂度为O(n log n),最坏情况为O(n2),不稳定排序。 快速排序一般实现为原地排序(in-place),因为非原地排序会设计到大量的容器创建和对象复制。...本文实现了两种快速排序,一种是单线程的快速排序,一种是一定数量的goroutine并行的快速排序。 同时也增加了标准库排序算法和timsort算法的比较。

    1.5K20

    排序算法 - 使用JavaScript实现快速排序 详解

    快速排序 描述 快速排序借用了分治的思想, 并且基于冒泡排序做了改进。...实现 基本框架 sortArray:入口方法 QuickSort:递归方法,负责不停的划分,直到 p q 指针对撞 partition: 划分函数,根据 pivot 划分区域,然后返回中点,中点右边的值均大于...= j){ // 交换到右分区,使得左边分区都小于或等于基数,右边分区大于或等于基数 swap(arr, i, j) j-- } } // 如果两个指针相等...,使得左边分区都小于或等于基数,右边分区大于或等于基数 swap(arr, i, j) } // 如果两个指针相等,单独比较 arr[j] pivot if(arr[j] > pivot...优化角度 分析上面三个版本的实现,我们可以发现,在随机化越高的情况下,快速排序所用的轮次会越少,所以一般我们可以通过打乱数组后进行排序,效率更高 var swap = (arr, i, j) => {

    90510

    Go:深入解析快速排序及其实现

    引言 快速排序是由C. A. R. Hoare在1960年提出的一种高效的排序算法,它也是最常用的排序算法之一。...快速排序的主要优势在于它的平均时间复杂度为O(n log n),并且它的分治法本质让它在处理大数据集时表现出色。在本文中,我们将详细探讨快速排序的原理,并使用Go语言实现一个快速排序函数。...图解快速排序 为了更好地理解快速排序,我们可以将其分解为以下步骤: 选择基准 分区操作,将比基准小的移至左边,比基准大的移至右边 对左右子序列递归执行上述操作 Go语言实现快速排序 Go语言以其简洁和高效著称...它在处理大量数据时特别有效,但需要注意的是,在最坏的情况下,快速排序的时间复杂度可以退化到O(n^2)。因此,选择合适的基准和使用随机化技术可以帮助避免这种情况。...结论与未来展望 快速排序因其优越的平均性能和编码的相对简易性而被广泛使用。随着数据量的不断增加,对排序算法的效率要求也越来越高。未来可能会有更多的研究来优化快速排序或开发新的更高效的排序算法。

    49610

    【初阶数据结构与算法】一命通关“快速排序“(内含快速排序的三个版本以及非递归)

    快速排序的单趟排序 - 代码实现 其实上述我们讲解的思路,就是发明该算法的人提出的,此人名为hoare。...有一部分的读者会认为:哎呀,我直接选待排序数组开头的元素,要不就是待排序数组结尾的元素作为key值挺好的啊,我能够理解hoare大佬的思想。 可以想一下快速排序的时间复杂度是多少?...所以人们就提出了两种选择key值的策略: 随机数选key 三数取中 那它们具体是如何实现的呢?请看下面的讲解。 4.2 随机数选key 这个方式我不是很推荐大家使用,不过这个方法现在仍有人在玩!...这里我们可以这么想,我们通过单趟排序使得区间划分成了两个部分,然后我们在对这两部分区间再次使用单趟排序的思想。...所以这里的关键就在于区间的划分,我们可以使用栈先将我们要后排序的区间先入栈,先排序的区间最后在入栈。

    8410

    如何使用JavaScript实现快速排序算法

    快速排序是一种常见的排序算法,在实际应用中使用广泛。它的时间复杂度是O(nlogn),相对于其他排序算法,它的执行效率更高。...除了使用中间元素作为基准值,还有其他选择基准值的方法,如随机选择、三数取中等。在实际应用中,根据具体情况选择不同的基准值选择方法可以提高算法的性能。...此外,在实现过程中还可以使用其他优化策略,如尾递归优化、循环展开等,来提高算法的性能。另外,在实现快速排序算法时,还有一些优化可以考虑。第一个优化是针对基准值的选择。...思考:快速排序算法的实现是相对简单的,但是它的效率却非常高。这是因为它使用了分治思想,将一个大问题分成两个小问题,然后递归地解决子问题。...通常情况下,选择数组中间的元素作为基准值是一个比较好的选择,但也有其他的选择方法,比如随机选择基准值或者选取三个元素取中间值等方法。最后,快速排序算法虽然效率高,但也有一些缺点。

    20000

    数据结构从入门到精通——快速排序

    然而,在实际应用中,由于快速排序的随机性,其平均时间复杂度为O(nlogn),因此在实际应用中具有很高的效率。...三、三种快速排序的动画展示 hoare版本快速排序的动画展示 Hoare版本快速排序的动画展示揭示了该排序算法的工作原理。...hoare——快速排序 挖坑法快速排序的动画展示 挖坑法快速排序是一种排序算法的可视化展现。...(QuickSort)算法,使用了Hoare版本的分区(partitioning)策略。...常用的选择方法有随机选择、中位数选择和三数取中等。 使用插入排序:对于小规模的子数组,使用插入排序可能比快速排序更高效。当子数组的规模小于某个阈值时,可以切换到插入排序来提高性能。

    1.3K10

    深入理解快速排序和STL的sort算法

    Hoare,1934年1月11日-),昵称为东尼·霍尔(Tony Hoare),生于大英帝国锡兰可伦坡(今斯里兰卡),英国计算机科学家,图灵奖得主。 他设计了快速排序算法、霍尔逻辑、交谈循序程式。...2.2.2 基本过程 快速排序使用分治法来把一个序列分为小于基准值和大于基准值的两个子序列。...一个优化的方向就是使用三分区模式:小于区间、等于区间、大于区间,这样在后续的处理中则只需要处理小于区和大于区,降低了等于基准值区间元素的重复处理,加速排序过程。...笔者使用相同的数据集在二分区模式下测试10w数据规模耗时大约是1800ms,数据集减少10倍耗时却增大了几十倍,或许二分区代码还是存在优化空间,不过这个对比可以看到存在大量重复元素时三分区性能还是很不错的...优缺点也大致清楚了,所以可以猜想一下内省式排序在实际中是如何调度使这三种排序算法的: 启动阶段 面对大量的待排序元素,首先使用快速排序进行大刀阔斧排序,复杂度可以在O(nlogn)运行 深入阶段 在快速排序使用递归过程中

    1.4K30

    【说站】python快速排序算法的使用

    python快速排序算法的使用 1、选择列表中最后一个元素最基准数N,小于N的放前,大于等于N的放后。 2、将前面的最后一个数字作为基准,同上放置。 3、直到每个部分的标记相等,即完成快速排序。... high):     n = len(my_list)     if n == 1:         return my_list     if low 排序...        N = move_num(my_list, low, high)  # 一次比较排序         quick_sort(my_list, low, N - 1)  # 递归前一部分排序...":     my_list = [8, 0, 4, 3, 2, 1]     print("排序前的数组:", my_list)     print("排序后的数组:", quick_sort(my_list..., 0, len(my_list) - 1)) 以上就是python快速排序算法的使用,希望对大家有所帮助。

    32440

    快速排序(Java分治法)

    Hoare于1962年提出的 快速排序的分治策略 划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列r1 … ri-1和ri+1 … rn,前一个子序列中记录的值均小于或等于轴值,后一个子序列中记录的值均大于或等于轴值...快速排序的过程上,每次分区都要遍历待分区区间的所有数据,所以,每一层分区操作所遍历的数据的个数之和就是n。...3.4 性能影响因素 快速排序算法的性能取决于划分的对称性。通过修改算法partition,可以设计出采用随机选择策略的快速排序算法。...在快速排序算法的每一步中,当数组还没有被划分时,可以在a[p:r]中随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分是较对称的。...随机 在所要排序的数组中,随机选取一个数来作为基准值,需要将其交换到最边上。 直接取最边上的值(任选左右)。

    87810

    算法学习:快速排序

    引言 快速排序(Quick Sort)是一种高效的排序算法,由计算机科学界的传奇人物托尼·霍尔(Tony Hoare)于1960年巧妙地提出。...分区操作(Partitioning) 分区操作是快速排序的精髓所在。...代码中使用了ES6的解构赋值来简化元素交换的操作,使得代码更加简洁易读。 优化建议 1. 三数取中法 核心思想:通过更智能地选择基准值(pivot)来优化快速排序的性能。...平均情况:在实践中,若假定分区大致均匀,即每次都能将数据集分为两个大小相似的子集,快速排序的平均时间复杂度同样为O(n log n)。这对于多数随机分布数据集而言,是一个非常高效的排序方案。...总结 快速排序算法通过分治法策略实现高效排序,其核心包括选择基准值、分区操作及递归排序子序列三大步骤。

    13910

    美团面试:请手写一个快排,被我怼了!

    下面,我们就来分析分析----快速排序。 背景 来自百科: 快速排序由C. A. R. Hoare在1962年提出。...核心思想: 先从数列中取出一个数作为基准数,然后进行大小分区; 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边; 再对左右区间重复第二步,直到各区间只有一个数,排序完成。...快速排序法全流程 3.代码实现 下面,我们使用Java语言来实现前面的快排案例: import java.util.Arrays; public class QuickSortDemo {....cnblogs.com/blog/1258817/201903/1258817-20190326191158640-601403776.png 所以平均时间复杂度为O(nlog2n) 空间复杂度: 快速排序使用的空间是...快速排序法总结 默认取第一个元素为轴心点(轴心点的确认区分了 “快速排序法”和“随机排序法”)两种算法,而随机排序则随机rand一个元素为轴心点; 如果两个不相邻元素交换,可以一次交换消除多个逆序,加快排序进程

    56620
    领券