要求
- 给只有0 1 2三个元素的数组排序
思路
- 方法1:遍历数组,利用辅助数组保存三个元素的个数,再写入(遍历两遍)
- 辅助数组有三个元素,对应0 1 2的个数
- 方法2:模拟三路快排,遍历一遍完成排序
- 三个索引,zero和two用于首尾的扩充,i用于遍历
- 遍历数组,每个元素只有三种可能
- 0 2移到首尾,1不动
实现
方法1
1 void sortColors(vector<int>& nums){ 2 int count[3] = {0}; 3 for( int i = 0 ; i < nums.size() ; i ++ ){ 4 assert( num[i] >= 0 && nums[i] <= 2 ); 5 count[nums[i]] ++; 6 } 7 8 int index = 0; 9 for( int i = 0 ; i < count[0] ; i ++ ){ 10 nums[index++] = 0; 11 for( int i = 0 ; i < count[1] ; i ++ ){ 12 nums[index++] = 1; 13 for( int i = 0 ; i < count[2] ; i ++ ){ 14 nums[index++] = 2; 15 } 16 }
方法2
1 void sortColors1(vector<int>& nums){ 2 int zero = -1; 3 int two = nums.size(); 4 for( int i = 0 ; i < two ; ){ 5 if( nums[i] == 1 ) 6 i ++; 7 else if( nums[i] == 2 ){ 8 two --; 9 swap( nums[i] , nums[two] ); 10 }else{ 11 assert( nums[i] == 0 ); 12 zero ++; 13 swap( nums[zero] , nums[i] ); 14 i ++; 15 } 16 } 17 }
相关
215 Kth Largest Element in an Array