> 技术文档 > 分治思想算法——颜色分类

分治思想算法——颜色分类

分治思想排序,就是把整个数组分成若干个子数组,然后只要处理好每一个子数组中的排序即可。

此题本质就是让我们把相同的元素放在一起并进行升序排列。我们采用分治的思想把数组分割,也就是用“指针”——三指针

left:用于标记0区域的最右侧

i:用于遍历数组

right:用于标记2区域的最左侧

使得[0,left]都是0,[left+1,i-1]都是1,[i,right-1]待遍历元素,[right,n-1]都是2

接下来我们看一下元素如何交换,一共就是三种情况,nums[i]是0,1,2.

如果是0,直接让left的下一个与nums[i]交换即可,然后i++,left++。(极端情况,如果此时i位置恰好是left的下一个,就相当于自己交换,也符合情况)。

如果是1,直接让i++即可。

如果是2,先让right-1和num[i]交换然后right--,此时i不能++,因为交换后i对应的元素仍是未遍历的(一直在第三个区间)所以还需要再遍历一次。

void sort(vector&nums){ int n=nums.size(); int left=-1,right=n,i=0; //left和right的定义是为了代码情况统一 while(i<right) //不遍历所有是因为right的右所有都符合要求了 { if(nums[i]==0) swap(nums[++left],nums[i++]); else if(nums[i]==1) i++; else swap(nums[--right],nums[i]); }}

西北信息网