当前位置: 首页 > news >正文

快排算法 (分治实现)

本算法采用将整个数组划分成三个部分 <key  =key  >key 

在数组全是同一个数字时,也能达到NlogN的时间复杂度

下面的板书中i为遍历数组的下标

left为<key的最右边的下标

right为>key的最左边的下标

例题1:912. 排序数组 - 力扣(LeetCode)

例题2:LCR 159. 库存管理 III - 力扣(LeetCode)

答案1:

class Solution {
public:
    //统一全传begin和end
    int Getrand(int begin ,int end)
    {
        return (rand()%(end-begin+1)+begin);
    } 

    void qsort(vector<int>& nums, int begin ,int end)
    {
        if(begin>= end) return;

        int key =nums[Getrand(begin ,end)];
        //数组分三块
        int i=begin ,left =begin-1,right=end+1;
        while(i<right)//数组分三块的最终条件
        {
            if(nums[i] < key) swap(nums[++left],nums[i++]);
            else if(nums[i] == key) i++;
            else swap(nums[--right],nums[i]);
        }
        //[begin left][left+1 right-1][right end]
        qsort(nums ,begin,left);
        qsort(nums ,right ,end);
    }
    vector<int> sortArray(vector<int>& nums) 
    {
        srand(time(nullptr));
        qsort(nums ,0 ,nums.size()-1);
        return nums;
    }
};

答案2:

class Solution {
public:
    int Getrand(int begin ,int end)
    {
        return (rand()%(end-begin+1)+begin);
    }
    void qsort(vector<int>& stock ,int begin ,int end)
    {
        if(begin>= end) return;
        int key =stock[Getrand(begin ,end)];
        //数组分三块
        int i=begin ,left =begin-1 ,right =end+1;//left是小于key ,right是大于key
        while(i<right)
        {
            if(stock[i]<key) swap(stock[++left],stock[i++]);
            else if(stock[i] == key) i++;
            else swap(stock[--right] ,stock[i]);
        }
        //[begin left ][left+1 right-1][right end]
        qsort(stock ,begin,left);
        qsort(stock ,right ,end);
    }
    vector<int> inventoryManagement(vector<int>& stock, int cnt) 
    {
        srand(time(nullptr));
        qsort(stock ,0 ,stock.size()-1);
        vector<int> ret;
        int i=0;
        while(cnt--)
        {
            ret.push_back(stock[i++]);
        }
        return ret;
    }
};

相关文章:

  • 11. Langchain输出解析(Output Parsers):从自由文本到结构化数据
  • 【后端开发】Spring MVC-常见使用、Cookie、Session
  • 分析下HashMap容量和负载系数,它是怎么扩容的?
  • 底盘---全向轮(Omni Wheel)
  • 重温Java - Java基础二
  • 无人设备遥控器之通信链路管理篇
  • C++ 创建静态数组出现栈满程序崩溃的问题
  • 【虚拟机栈中的栈帧是什么?有什么作用?局部变量表、操作数栈、动态链接和方法返回地址是什么?有什么作用?为什么要放在栈帧里?】
  • Ubuntu24.04 编译 Qt 源码
  • 一个可以在Android手机上运行的Linux高仿window10的应用
  • Python中的AdaBoost分类器:集成方法与模型构建
  • VT01N/VT02N进行交货的时候,对装运点加权限控制的增强
  • 原生SSE实现AI智能问答+Vue3前端打字机流效果
  • 【语法】C++的list
  • 模糊测试究竟在干什么
  • 41、web前端开发之Vue3保姆教程(五 实战案例)
  • 结合大语言模型整理叙述并生成思维导图的思路
  • C语言--常用的链表操作
  • 分布式存储怎样提高服务器数据的安全性?
  • Vue3+Vite+TypeScript+Element Plus开发-09.登录成功跳转主页
  • 信息推广网站点不开的那种怎么做/seo优化收费
  • 经验分享的网站开发/腾讯效果推广
  • hois.skxy.wordpress/seo分析案例
  • 广西流行病毒最新消息新闻/沈阳seo顾问
  • 淮南市网站开发的方式/推广策略可以分为哪三种
  • 宜昌 网站建设 公司/优化步骤