1.三色旗问题:有一个数组只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。
2.解题思路:
(1) 定义两个变量,i和j (下标),从index = 0 开始遍历
(2) 如果 vec[index]==0, swap(vec[index++], vec[++i]);(这里index++ 的原因是,index左边不可能有==2的数据了);
(3) 如果 vec[index]==1, index++;
(4) 如果 vec[index]==2, swap(vec[index],vec[--j]); (这里没有index++,是因为在右侧不知道交换过来的数据是大于1还是小于1还是等于1)
(5) i的含义:<=i 的部分都是比1小的, 所以i 的初值 == -1
(6) j的含义:>=j 的部分都是比1大的,所以j 的初值 == n
#include<iostream>
using namespace std;
#include<vector>
#include <algorithm>
void Qucik(vector<int> &vec)
{
int i = -1;
int j = vec.size();
int index = 0;
while (index < j)
{
if (vec[index] == 1)
{
index++;
}
else if (vec[index] == 2)
{
swap(vec[--j], vec[index]);
}
else if (vec[index] == 0)
{
swap(vec[++i], vec[index++]);
}
}
}
int main()
{
vector<int> vec = {1,0,1,2,1,2,1,0,1};
Qucik(vec);
for (int i =0;i < vec.size();i++)
{
cout << vec[i]<<" ";
}
return 0;
}