定义三个下标:Begin,End,Cur。Begin指示0的位置,End指示2的位置,Cur从头到尾扫描一遍,则:
当Cur为0时,与Begin交换,Cur++,Begin++;
当Cur为2时,与End交换,End--;
当Cur为1,时,Cur++
#include<iostream>
using namespace std;
void Flags(int* arr,int len){
int Begin = 0,End = len-1,Cur = 0;
while(Cur <= End){
if(arr[Cur] == 2)
swap(arr[Cur],arr[End--]);
if(arr[Cur] == 0)
swap(arr[Cur++],arr[Begin++]);
if(arr[Cur] == 1)
Cur++;
}
}
int main(void){
int arr[] = {2,1,0,2,0,1,2,2,0,1,2,0,2,1,2,0,0,2,1,2,2};
int len = sizeof(arr)/sizeof(int);
Flags(arr,len);
for(int i = 0;i < len;i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}