快排的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++;
}
}