目的
旨在记录在Leedcode网上刷题的过程,记录心得。
题目
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
思路
题目是要求邻近大小的元素放在一起,所以这是一道数学上排序问题。因此,采用了最简单的冒泡排序的逆向思路来实现。
冒泡排序的算法描述:
- 步骤1: 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 步骤2: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 步骤3: 针对所有的元素重复以上的步骤,除了最后一个;
- 步骤4: 重复步骤1~3,直到排序完成。
代码
class Solution {
public:
void sortColors(vector<int>& nums) {
int numlen=nums.size();
if(nums.empty()) return;
for(int i=0;i<numlen;i++){
int nexti=i+1;
while(nexti<numlen){
if(nums[i]>nums[nexti]){// 交换
int temp = nums[i];
nums[i] = nums[nexti];
nums[nexti] = temp;
}
nexti++;
}
}
}
};
效果
总结
要学会善于将实际问题抽象成数学问题来处理,及时温习数据结构的相关算法。