给定一个包含红色、白色和蓝色,一共 n
个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
示例 :
输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1] 输出:[0,1,2]
示例 3:
输入:nums = [0] 输出:[0]
示例 4:
输入:nums = [1] 输出:[1]
提示:
n == nums.length
1 <= n <= 300
nums[i]
为 0
、1
或 2
考察排序,使用快排的变种,只不过不需要用来比较的基础元素,直接用双指针i与j,分别从头尾找出非0与0元素进行置换。两次循环,第一次将0与非0分别看做一类,0存放在前排,非零在后排;第二次循环在非零中将1与2分别看做一类,1存放在前排,2在后排;
用index变量存放第一次排序中0与非零的分界线(非0的第一位)。
1 class Solution { 2 public void sortColors(int[] nums) { 3 4 int i=0; 5 int j=nums.length-1; 6 int temp=0; 7 int index=0; 8 //处理0与非零 9 while(i<j){ 10 while(i<j&&nums[i]==0){ 11 i++; 12 index=i; 13 } 14 while(i<j&&nums[j]!=0)j--; 15 temp=nums[i]; 16 nums[i]=nums[j]; 17 nums[j]=temp; 18 } 19 20 //处理1与2 21 i=index; 22 j=nums.length-1; 23 while(i<j){ 24 while(i<j&&nums[i]==1)i++; 25 while(i<j&&nums[j]==2)j--; 26 temp=nums[i]; 27 nums[i]=nums[j]; 28 nums[j]=temp; 29 i++; 30 j--; 31 } 32 } 33 }
原文:https://www.cnblogs.com/SEU-ZCY/p/14772536.html