算法(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;
}


 

posted @ 2020-02-05 09:56  jasmineTang  阅读(133)  评论(0)    收藏  举报