首页 > 其他分享 >leetcode 75. Sort Colors & 三路快速排序

leetcode 75. Sort Colors & 三路快速排序

时间:2024-09-02 11:48:16浏览次数:3  
标签:Sort std nums int 75 while Colors 排序 ptr

leetcode 75. Sort Colors & 三路快速排序

只有0和1的情况

在这种简化情况下,我们只需要顺序遍历数组,遇到0就放到前面即可。

class localExperiment
{
public:
    void sort01(std::vector<int> &nums)
    {
        int zero_ptr = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(!nums[i])
                std::swap(nums[i], nums[zero_ptr++]);
        }
        for(auto num : nums)
            std::cout << num << " ";
        std::cout << std::endl;
    }
};

这道题的解法

这道题在0和1的基础上加入了一个2,只需要在0和1的处理逻辑之前加上处理2的逻辑即可。

class Solution
{
public:
    void sortColors(std::vector<int> &nums)
    {
        int m = nums.size();
        int zero_ptr = 0, two_ptr = m - 1;
        for(int i = 0; i < m && i <= two_ptr; i++)
        {
            while(nums[i] == 2 && i <= two_ptr)
                std::swap(nums[i], nums[two_ptr--]);
            if(!nums[i])
                std::swap(nums[i], nums[zero_ptr++]);
        }
    }
};

第一个要用while,第二个仍然是if的原因:

假设我们输入的数组是

0 2 0 1 0 2 1 2 

当我们的i = 1, two_ptr = 7的时候,会发生一次无效交换,导致nums[1]再也无法回到正确的位置上去了,所以这一步需要用while

又因为我们已经用while解决了2带来的无效交换问题,我们的0和1交换的部分仍然可以沿用之前的逻辑。

三路快速排序

// 模板的 T 参数表示元素的类型,此类型需要定义小于(<)运算
template <typename T>
// arr 为需要被排序的数组,len 为数组长度
void quick_sort(T arr[], const int len) {
  if (len <= 1) return;
  // 随机选择基准(pivot)
  const T pivot = arr[rand() % len];
  // i:当前操作的元素下标
  // arr[0, j):存储小于 pivot 的元素
  // arr[k, len):存储大于 pivot 的元素
  int i = 0, j = 0, k = len;
  // 完成一趟三路快排,将序列分为:
  // 小于 pivot 的元素 | 等于 pivot 的元素 | 大于 pivot 的元素
  while (i < k) {
    if (arr[i] < pivot)
      swap(arr[i++], arr[j++]);
    else if (pivot < arr[i])
      swap(arr[i], arr[--k]);
    else
      i++;
  }
  // 递归完成对于两个子序列的快速排序
  quick_sort(arr, j);
  quick_sort(arr + k, len - k);
}

注意,当pivot < arr[i]的时候,只交换,但是i不加一,这和for循环的时候用while是等价的。

标签:Sort,std,nums,int,75,while,Colors,排序,ptr
From: https://www.cnblogs.com/smartljy/p/18392436

相关文章

  • 20240831_175311 scratch 专题训练列表
    20240831_174427scratch自制积木的基本使用_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1188347120240831_174849scratch画笔模块入门必会_鲸鱼编程pyhui的技术博客_51CTO博客https://blog.51cto.com/u_13137233/1188348120240831_175038scratc......
  • 20240831_175038 scratch 画笔模块基础图形绘制
    20240904_095445scratch绘制正方形需求实现20240904_105445scratch绘制长方形需求实现注意长方形的长与宽不一样所以不要使用重复执行4次20240904_115445scratch绘制圆形需求实现20240904_125445scratch绘制正三角形需求实现202......
  • 好想你上半年净利润暴跌仍分红1.75亿,销售费用大增研发费用大降
    《港湾商业观察》廖紫雯日前,“红枣第一股”好想你发布半年报,披露上半年增收不增利等情况。自2020年出售百草味以来,公司利润端出现近乎断崖式下跌的样态,好想你苦业绩承压已久。以半年报情况来看,公司于销售费用端出现较大增长,但上半年营收增长未超两成的情况下,公司净利润下滑......
  • WPF mouse down on canvas and draw shapes which render with random colors
    //customcontrol//xaml<UserControlx:Class="WpfApp307.ElpTbk"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"......
  • 基于STM32F407ZGT6用BH1750在OLED显示屏上显示光照数据,根据光照强度控制小灯亮灭(路灯
    占空比:高电平占整个电平周期的持续时长,从而控制小灯的亮度,小灯亮度的控制需用定时器的输出比较功能。PWM部分可以参考这篇文章PWM——基于STM32F407ZGT6开发板-CSDN博客此外我们还需要了解IIC的工作原理1.pwm.c   #include"public.h"/*pwm控制led实现呼吸灯1.......
  • sort排序
    sort排序任务一:选第k大的元素#include<bits/stdc++.h>//任务:选第k大的元素usingnamespacestd;intmain(){vector<int>a={1,9,2,6,7,8};//方法一:从小到大排序(默认)sort(a.begin(),a.end());intk;cin>>k;cout<<a[a.size()-k]<<e......
  • P7075 [CSP-S2020] 儒略日 题解
    P7075[CSP-S2020]儒略日题面:题目描述为了简便计算,天文学家们使用儒略日(Julianday)来表达时间。所谓儒略日,其定义为从公元前4713年1月1日正午12点到此后某一时刻间所经过的天数,不满一天者用小数表达。若利用这一天文学历法,则每一个时刻都将被均匀的映射到数轴......
  • Java算法之基数排序(Radix Sort)
    简介基数排序是一种非比较型整数排序算法,其原理是按照低位先排序,然后收集,再按照高位排序,再收集,依次类推,直到最高位。这种方法可以视为对每个位上的数字进行稳定的排序。算法步骤确定最大数的位数。对每一位进行排序:从最低位开始,使用稳定的排序算法(如计数排序)对当前位进......
  • P10975 Mondriaan's Dream 解题报告
    题目传送门题目大意给定一个\(N\timesM\)的网格,求用\(1\times2\)和\(2\times1\)的长方形去铺满它有多少种方案。数据范围:\(N,M\le11\)。思路:考虑怎么放才能刚好填满网格。可以想到,如果先放横着的,再放竖着的,那么当我们将横着的都放完后,若竖着的恰好能刚好嵌进去,说......
  • 【Markdown笔记】设置字体颜色——转载https://blog.csdn.net/u012028275/article/det
     【Markdown笔记】设置字体颜色dadalaohua于2021-04-0517:53:19发布阅读量5.7w 收藏 293点赞数103分类专栏: Markdown笔记 文章标签: markdown latex html版权GitCode开源社区文章已被社区收录加入社区Markdown笔记专......