数据结构——三路划分(快排优化)

这篇具有很好参考价值的文章主要介绍了数据结构——三路划分(快排优化)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构——三路划分(快排优化),数据结构,数据结构,c语言,c++,windows,排序算法

刷Leetcode时遇到的问题,用普通的快排去跑,发现有问题。

数据结构——三路划分(快排优化),数据结构,数据结构,c语言,c++,windows,排序算法

 普通的Hoare或者其他的快排好像都没有直接解决掉这个问题,当一个数重复出现的时候,用普通的快排效率其实并没有那么高。所以,这也是普通快排的缺点之一。

数据结构——三路划分(快排优化),数据结构,数据结构,c语言,c++,windows,排序算法

所以,在一个元素重复出现多次的时候,可以用三路划分来优化快排。

数据结构——三路划分(快排优化),数据结构,数据结构,c语言,c++,windows,排序算法

思考一下,为什么当arr[cur] > key的时候,cur不++呢?

这是因为,我们只知道当时在cur位置上的值比key大,而right不知道比key大还是小,所以不用cur++,而right--,是因为在交换后,已经知道肯定比key大了。 

源码如下:

void QuickSork(int arr[],int left,int right)
{
    if(left >= right)
        return;
    
    int begin = left;
    int end = right;

    int cur = left+1;
    int key = arr[left];
    while(cur <= right)
    {
        if(arr[cur] < key)
        {
            swap(arr[left],arr[cur]);
            cur++;
            left++;
        }else if(arr[cur] > key)
        {
            swap(arr[cur],arr[right]);
            --right;
        }else 
        {
            ++cur;
        }
    }

    QuickSork(arr,begin,left-1);
    QuickSork(arr,right+1,end);

}

 文章来源地址https://www.toymoban.com/news/detail-714690.html

 

 

到了这里,关于数据结构——三路划分(快排优化)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “掌握更多的快速排序技巧:三路划分、双路快排和非递归的深入理解”

    快速排序是一种基于分治思想的排序算法,它能够以极快的速度将一个乱序的数组重新排列成有序的序列。不仅如此,快速排序还具有简洁的实现代码和良好的可扩展性,成为最受欢迎的排序算法之一。接下来,让我带你了解一下它的魅力吧!💫 快速排序是Hoare于1962年提出

    2024年02月16日
    浏览(28)
  • 【C语言】【数据结构初阶】 快排变慢排?怎么个事儿?

    我们知道,快排是一种很好的排序算法。但是在 极少数 的一些情况下,“快速排序”好像名不副实了。 当数据量非常大,且递归深度太深,有栈溢出的风险。 这样,我们就得到了一个很可惜的结论:快排不是万金油。 但是,这是指的 递归版本 的快排,我们可以写 非递归

    2024年02月17日
    浏览(45)
  • 数据结构——快排与归并

    重要的事说三遍! 学习!学习!学习! 努力!努力!努力! 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列

    2024年02月08日
    浏览(34)
  • 【数据结构】快排的详细讲解

    江河入海,知识涌动,这是我参与江海计划的第7篇。 目录:         快排是排序算法中效率是比较高的,快排的基本思想是运用二分思想,与二叉树的前序遍历类似,将数据划分,每次划分确定1个基准值(就是已经确定好有序后位置的数据),以升序为例,基准值左面的数据

    2024年02月06日
    浏览(78)
  • 【数据结构】排序之交换排序(冒泡 | 快排)

    在之前的博客中介绍了插入排序,有需要的可以点这个链接: link,这次来介绍交换排序,包括冒泡和快排。 话不多说,正文开始。 基本思想 :所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。 交换排序的特点是:将键值较大的记录向序

    2024年02月03日
    浏览(26)
  • 数据结构与算法-选择&冒泡&快排&计数

        一:选择排序     场景:找出一个班上身高最高的人你会怎么找?A B C D A B 选择排序的思路和插入排序非常相似,也分已排序和未排序区间。但选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。但是不像插入排序会移动数组 选择排序会每次

    2024年02月09日
    浏览(32)
  • 全网最全的快速排序方法--Hoare快排 挖坑法快排 二路快排 三路快排 非递归快排

    目录 一.快速排序 1.基本介绍 2.基本思想 二.Hoare快排 0.前情知识 1.交换数组中的两个元素 2.指定范围的插入排序 1.基本思路 2.代码实现 3.优化思路 三.挖坑法快排(校招中适用) 1.基本思路 2.代码实现 四.二路快排 1.基本思路 2.代码实现 3.优化思路 五.三路快排 1.基本思路 2.代码

    2023年04月21日
    浏览(35)
  • 三路快排Java版(带思路分析)

    这里我们直接开始讲相对的最优解 带随机数的三路快排 好了,中间还有很多版本的快排,但是都有一些问题导致在某种极端情况下造成耗费时间极多。 基础快排:在 序列本身有序 的情况下复杂度为O(n²) 带随机数的快排:在 序列本身有序 的情况下复杂度为O(nlogn),但

    2024年02月06日
    浏览(25)
  • C语言数据结构+KMP算法next数组优化计算方法+优化后子串匹配代码实现

    通过我之前那篇KMP算法的讲解,我们可以快速手算KMP算法的next数组,但是之前计算的next数组在一些情况下会有缺陷,比如模式串’aaaab’和主串’aaabaaaab’进行匹配 令模式串指针为j 当第一个元素不匹配时,下一次匹配还是要从模式串的第一个元素与主串匹配,其实我们可以直接写

    2024年02月06日
    浏览(34)
  • 【数据结构】带你玩转排序:堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序

    英杰社区 https://bbs.csdn.net/topics/617804998 目录 常见算法的实现         插入排序         希尔排序         堆排序         选择排序         冒泡排序         快速排序         Hoare版本         随机选Keyi               三数取中         挖坑法  

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包