算法(5)-荷兰国旗-JAVA

  把一个数组分为三个部分,像荷兰的三色旗一样。分别为>、=、<,三个区域。
 

// 在arr[L..R]上,根据p分块,<p 左边,==p中间,>p右边
// 返回值:长度为2的数组,区域的左边界,右边界
//如果无等 返回值 左>右
// <区 下标 less,  >区下标 more,  index 当前位置下标
int[] partition(int[] arr,int L,int R,int p)
{
    int less=L-1;// <区域右边界
    int more=R+1;//>区域左边界
    int index=L;
    while(index<more)//index是当前数的下标
    {
        if(arr[index]<p) {  swap(arr,++less;index++); }
       // 1.区域右扩 先右扩
       //2.数据交换  当前位置和区域+1 换 ++less(less=less+1)先移位再操作  
       //3.当前数跳下一个 index++  先返回,再++
        else if(arr[index]>p)  {   swap(arr,--more;index);  }
        //1.区域左移 
        //2.数据交换  当前位置和区域-1 换--more(more=more-1) 先赋值后操作
        //3.当前数不动 index
        else  { index++;}
        //当前数直接跳下一个
     }
    return new int[] {less+1,more-1};
}

swap(int[] arr,int i,int j)
{
    int tmp=arr[i];
    arr[i]=arr[j];
    arr[j]=tmp;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值