//给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。示例 1:
输入: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]
快速排序之如何分割?
快速排序分割结果:数组左边的值都小于分割点,右边的值大于分割点的值。
1.拿最右边作为分割点,遍历列表,拿列表里的每个元素与分割点进行比较;
2.设计游标k指向列表最左边,如果当前值小于分割点,就将当前位置值与游标k对应元素进行交换,k进行加1操作,用k来记录的小于分割点元素的个数。
3.列表遍历完毕,交换k指向的元素与分割点的元素,return k
/*
快速排序:
1.拿最右边作为分割点,列表里的每个元素与分割点进行比较,
2.设计游标k指向列表最左边,如果小于分割点,就将当前位置值与游标k对应元素进行交换,k进行加1操作,
3.列表遍历完毕,交换k指向的元素与分割点,return k
*/
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
int partition(vector<int>&num,int left,int right)//right为数组最后一个下标
{
int k = left;//1.设置游标指向最左边
int temp;
for(int i = left;i<right;i++)//2.最右边作为分割点,因此遍历不到
{
if(num[i]<num[right])//3.当前遍历到的结点小于分割点,互换且k+1;否则继续遍历
{
temp = num[i];
num[i] = num[k];
num[k] = temp;
k++;
}
}
temp = num[k];//k指向的值与分割点交换,此时k指针的左边全是小于num[k]的数,右边全大于num[k]
num[k]=num[right];
num[right]=temp;
return k;//返回分割点下标
}
void QuickSort(vector<int>&num,int left,int right)
{
if(left<right)
{
int pivot = partition(num, left,right);
QuickSort(num,left,pivot-1);
QuickSort(num,pivot+1,right);
}
}
void colorSort(vector<int>&num)
{
QuickSort(num,0,num.size()-1);
}
};
void PrintArray(vector<int>&num1) //打印数组
{
for(vector<int>::iterator it=num1.begin();it!=num1.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void test01()
{
vector<int> num = {2,0,2,1,1,0};
vector<int> num1 = {2,0,1};
vector<int> num2 = {0};
vector<int> num3 = {1};
Solution s1;
s1.colorSort(num);
PrintArray(num);
s1.colorSort(num1);
PrintArray(num1);
s1.colorSort(num2);
PrintArray(num2);
s1.colorSort(num3);
PrintArray(num3);
}
int main()
{
test01();
return 0;
}
运行结果
0 0 1 1 2 2
0 1 2
0
1