美文网首页
数据结构与算法:荷兰国旗问题

数据结构与算法:荷兰国旗问题

作者: 我爱铲屎 | 来源:发表于2019-07-20 13:16 被阅读0次
荷兰国旗

荷兰国旗问题:简单来说就是,我们以一个数num作为基准,将一个数组划分为左侧为小于num的部分,右侧为大于num的部分,中间为等于num的部分。
假设一个数组为4 3 7 6 5 2 5,且num=5,以此来划分,最终数组被划分为左侧小于5,中间等于5,右侧大于5。像这样:4 3 2 5 5 6 7 。需要注意的是经过这样划分后的数组不一定是有序的。

如何划分

假设我们需要对L 到 R 的序列区间变成满足荷兰国旗描述的序列区间,我们需要先准备 less 指针和 more 指针分别指向 L 的左侧和 R 的右侧。cur指针指向 L 。less 指向的区域为小于 num的区域, more 指向的区域为大于 num 的区域。如下图示:


图片1.png

从 cur 当前指向的位置开始,将其指向的数与 num (num = 5) 进行比较。如果该数小于 num ,则 cur 指向的数就与 less 区域的后一个数比较,并且less指针加一,cur 指向下一个数;如果该数等于 num, 则 cur 指针直接指向下一个位置;如果该数大于 num ,则 cur 指向的数就与 more 区域的前一个数比较,并且 more 指针减一。一直重复这样的划分操作指导 cur 指针与 more 相遇为止。


图片2.png
伪代码描述

while(cur < more){
if(当前数 = num) cur++
if(当前数 < num) 和小于区域后一个数交换,less++,cur++
if(当前是 > num) 和大于区域前一个数交换,more--
}

完整代码
public static int[] partition(int[] arr,int left,int right,int num) {
        
            //if(arr == null) return null;
            
            int less = left - 1;
            int more = right + 1;
            int current = left;
            
            while(current < more) {
                if(arr[current] < num) {
                    swap(arr,less+1,current);
                    less++;
                    current++;
                }else if(arr[current] > num) {
                    swap(arr,more-1,current);
                    more--;
                }else {
                    current++;
                }
                
            }
        
        
        return new int[] {less+1,more};
    }
    
    private static void swap(int[] arr,int i,int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

相关文章

  • 数据结构与算法:荷兰国旗问题

    荷兰国旗 荷兰国旗问题:简单来说就是,我们以一个数num作为基准,将一个数组划分为左侧为小于num的部分,右侧为大...

  • 算法—数组:荷兰国旗问题

    tips:本文章内容来自《程序员编程艺术:面试和算法心得》给定一个字符串里面只有"R" "G" "B" 三个字符,...

  • [算法题] 荷兰国旗问题

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

  • 算法之荷兰国旗问题

    题目一:给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要...

  • 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/rspylctx.html