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++;
     }
}
发布了51 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qigezuishuaide/article/details/105503791