这个题很简单 典型的计数排序
即已知待排序的数的值域是已知的 那么可以用一个数组存储每个数字出现的次数 然后在按照出现的次数重新输出
本题的过程中遇到了一个问题 那就是数组的初始化
要注意new方法申请数组的时候 只有当加()之后new才会自动赋初值0 否则不会负初值 即int *a=new int[3]();
本题还有第二个做法,因为题目的标签显示了two pointer 因此考虑使用指针的方法
因为题目就是对若干个0 1 2三个数字排序 那么第一个指针负责把所有的0都交换到结果的最前面 第二个指针负责把所有的2放到结果的后面
依次遍历每一个数 当为0的时候把这个数字和第一个指针所指向的数字交换 然后第一个指针指向下一个位置 然后遍历下一个数 当为2时与第二指针所指向的数字交换 当所有数字遍历结束后即排好序
class Solution {
public:
void swap(int &a,int &b)
{
int temp=b;
b=a;
a=temp;
}
void sortColors(int A[], int n) {
if(A==NULL||n==0)
return;
int start=0,end=n-1;
for(int i=0;i<=end;i++)
{
while(A[i]==2&&i<=end)
{
swap(A[i],A[end]);
end--;
}
if(A[i]==0)
{
swap(A[i],A[start]);
start++;
}
}
}
};