02荷蘭國旗問題

快排的merge過程

給你一個固定的數組,在這個數組上進行操作。給定一個x,最後的結果是:小於x的數放在數組的左邊,等於x的數放在數組中間,大於x的數放在數組的右側。

三個指針用於指示區域,一共分爲四個區域:小於x、等於x,待處理區和大於x。開始的時候,小於x的右邊界L=-1(一會說爲啥是-1,而不是0),等於x的右邊界爲m(等於x的左邊界就是L),大於x區的左邊界在最右邊R。用m遍歷數組,如果a[m]比x小,就把a[m]同(L+1)的位置互換,同時L++,m++。什麼意思呢?就是說a[m]比x小,所以小於x區會加大,所以L++,而加大後小於x的右邊界是L+1,所以這樣。如果等於a[m]=x,L和R都不變,m++。如果大於x,R–,m是不變的,因爲換過來的數不一定就等於x。核心思想就一句話:小於區推着等於區往右走,直至等於區的右邊界和大於區碰上

l指針的意思是,小於等於l的數都是小於區的,r的意思是大於等於r的數都是大於區的。了所以l和r的數值要比正常數組區間的數少一位和多一位。

void testmethod(vector<int>&a,int x)
{
     int n=a.size();
     if(n<=1)
         return ;
     int l=-1,mid=0,r=n;
 
     while(mid<r)
     {
         if(a[mid]<x)
              swap(a[++l],a[mid++]);
         else if(a[mid]>x)
              swap(a[--r],a[mid]);
         else
              mid++;
     }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章