美文网首页
荷兰国旗

荷兰国旗

作者: 鸡杂面 | 来源:发表于2019-10-04 14:38 被阅读0次
问题:

对于数组a,数组a中的一个元素k;数组a中小于k的元素放在数组的左边,等于k的元素放在数组中间,大于k的元素放在数组右边。

一、思路

  • 设定变量less,more来分别标志小于k的元素范围和大于k的元素范围;
    a[0] ~ a[less]是小于k的元素,a[more] ~ a[a.length - 1]是大于k的元素;
    a[less + 1] ~ a[more - 1]是等于k的元素。
  • 将less的初始值设为-1,more的初始值为a.length(表示此时不存在小于/大于区域);
  • 循环遍历数组,开始分类,设i为当前遍历的数组下标,i初始化为0;当i < more时循环继续(当i = more时,排序已经完成了)。遍历会出现3种情况:
  1. a[i] < k。此时将a[i++]与a[++less]互换,(将该元素换到小于区)下标前进一位,小于区增加一位。
  2. a[i] == k。此时不做交换,(不在小于/大于区就是在等于区)直接i++;下标前进一位,等于区增加一位。
  3. a[i] > k。此时a[i]与a[--more]交换(将该元素换到大于区),i不变动,下标不变(因为a[--more]是未遍历过的数,i不应该变动,要原地对交换过来的数进行判断分类),

二、java代码实现

默认以最后一个数为基准

public class HeLanGuoQi {
    
    public static void f(int[] arrs) {
        if(arrs.length < 2){
            return;
        }
               //基准数
        int x = arrs[arrs.length - 1];
               //左边界(小于区)
        int left = -1;
               //右边界(大于区)
        int right = arrs.length;
        int i = 0;
        while(i < right) {
            if(arrs[i] < x) {
               //小于
                swap(arrs, i++ , ++left);
            }else if(arrs[i] == x) {
               //等于
                i++;
            }else {
               //大于
                swap(arrs, i, --right);
            }
        }
    }
    public static void swap(int[] arrs, int a, int b) {
        int t = arrs[a];
        arrs[a] = arrs[b];
        arrs[b] = t;
    }
}

相关文章

  • 荷兰国旗

    荷兰国旗 题目描述: 拿破仑席卷欧洲大陆之后,代表自由,平等,博爱的竖色三色旗也风靡一时。荷兰国旗就是一面三色旗(...

  • 荷兰国旗

    问题: 对于数组a,数组a中的一个元素k;数组a中小于k的元素放在数组的左边,等于k的元素放在数组中间,大于k的元...

  • 快排

    荷兰国旗排序图示 荷兰国旗排序code [图片上传失败...(image-cf73bb-1563555823413)]

  • sort-colors

    荷兰国旗问题

  • 荷兰国旗问题

    给定一个数组,元素只有三种取值:0, 1, 2。分别代表三种颜色红白蓝。设计函数调整数组,使得数组按照0,1,2 ...

  • 荷兰国旗问题

    荷兰国旗问题:给定一个数num,将数组中划分成3部分,小于num的部分,等于num的部分,大于num的部分 例题:...

  • 荷兰国旗问题

    1.荷兰国旗问题 传入num 数组中大于num的数放左边 小于num的数放右边 等于num的数 放中间 1....

  • 荷兰国旗问题

    荷兰国旗问题 1、问题 荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示: 假设这样的条纹有多条,且各种颜色的...

  • 【算法】快速排序及优化

    一、荷兰国旗问题 在讲快速排序前,我们先来看看荷兰国旗问题。题目如下: 其实,这就是快排的partition过程,...

  • 【数组】--荷兰国旗问题

    问题:现有红,白,蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色球在一起。红白蓝...

网友评论

      本文标题:荷兰国旗

      本文链接:https://www.haomeiwen.com/subject/rmoeuctx.html