算法:快排(三指针算法)

1.三指针算法

在力扣题库中,题型中添加了超大量的重复数据;根本无法使用sort快排,一使用就超时;

三指针快排,是在双指针快排下,提出的优化方案,

无重复数据推荐使用双指针快排;

大量重复数据推荐使用三指针快排;

如果在数据结构章节,已经学会了快排的精髓;三指针代码一看就会;

2.题型

力扣:75、912、215、159;

3.模版代码如下

简单叙述如下:找到nums中的一个数key,将小于key的放在左边,大于key的放在右边;这样key的相对位置就确定了;(如果不理解请看我的一篇文章:数据结构:插入排序****)再把小于key的,和大于key的,那两个区域如此排好序;

cpp 复制代码
vector<int> sortArray(vector<int>& nums) {
        srand(time(NULL)); // 种下随机数种子
        quicksort(nums, 0, nums.size() - 1);
        return nums;
    }
    void quicksort(vector<int>& nums, int l, int r) {
        if (l >= r) return;
        // 数据分三块
        int key = getRandom(nums, l, r);
        int i = l, left = l - 1;
        int right = r + 1;
        while (i < right) {
            if (nums[i] < key) {
                left++;
                swap(nums[i], nums[left]);
                i++;
            } else if (nums[i] >key) {
                right--;
                swap(nums[i], nums[right]);
            } else i++;
        }
        //[1,left][left,right-1][right,r]
        quicksort(nums,l,left);
        quicksort(nums,right,r);
    }
    int getRandom(vector<int>& nums, int left, int right) {
        int r = rand();
        return nums[r % (right - left + 1) + left];
    }

4.提示

4.1千万不要相信,数据的绝对随机性;因为数据都是人写出来的,都是伪随机的,或人为排列的;所以只能再次通过种随机数种子伪随机,达到空间和时间复杂度的最小化;

相关推荐
刘永鑫Adam14 小时前
Nature Microbiology | 基于TRACS算法的跨多界宏基因组数据菌株水平溯源推演
算法
小O的算法实验室14 小时前
2026年SEVC,面向无人机辅助边缘计算的自适应群体智能算法,深度解析+性能实测
算法·边缘计算·智能算法·智能算法改进
高锰酸钾_14 小时前
计算机网络-网络层-路由算法与路由协议
计算机网络·算法·智能路由器
智者知已应修善业14 小时前
51单片机4按键控制共阳LED霓虹灯切换1整体闪烁2流水下3流水上4间隔闪烁】2023-10-27
c++·经验分享·笔记·算法·51单片机
XW-ABAP14 小时前
SAP ABAP 实现类似百度谷歌搜索引擎基础算法之一的,编辑距离算法
算法
嵌入式小能手14 小时前
飞凌嵌入式ElfBoard-进程间的通信之信号处理sigaction
linux·算法·信号处理
re林檎14 小时前
算法札记——5.14
算法
研究点啥好呢14 小时前
DJI 机器人视觉算法工程师 面试题精选:10道高频考题+答案解析(背诵版)
算法·面试·机器人·dji
热心网友俣先生15 小时前
2026年认证杯二阶段A题赛题解析
人工智能·算法·机器学习
Black蜡笔小新15 小时前
自动化AI算法训练服务器DLTM深度学习推理工作站AI赋能质检助力制造业智能化转型
人工智能·算法·自动化