这道题就是要将给定的数组变为三段,三段的长分别为1的个数,2的个数,3的个数。在三段中找不该是本段的数,到该数应在段中找原段中的数。如果该段找完了,就到另一段中找。代码如下。
#include<bits/stdc++.h>
using namespace std;
int a[1005],c1=0,c2=0,c3=0;
int search2(int x,int com){
int y=0;
for (y=x;y<=c1+c2;y++){
if (a[y]==com){
return y;
}
}
return y;
}
int search3(int x,int com){
int y=0;
for (y=x;y<=c1+c2+c3;y++){
if (a[y]==com){
return y;
}
}
return y;
}
int main (){
freopen ("sort3.in","r",stdin);
freopen ("sort3.out","w",stdout);
int n=0,i=0,cnt=0;
cin>>n;
int b[1005];
for (i=1;i<=n;i++){
cin>>a[i];
if (a[i]==1){
c1++;
}
else if (a[i]==2){
c2++;
}
else if (a[i]==3){
c3++;
}
}
int j=c1+1,k=c1+c2+1,t=0;
for (i=1;i<=c1;i++){
if (a[i]==2){
j=search2(j,1);
if (j!=c1+c2+1){
a[i]=1;
a[j]=2;
cnt++;
}
else {
k=search3(k,1);
a[i]=1;
a[k]=2;
cnt++;
}
}
else if (a[i]==3){
k=search3(k,1);
if (k!=n+1){
a[i]=1;
a[k]=3;
cnt++;
}
else {
k=search2(c1+1,1);
a[i]=1;
a[k]=3;
cnt++;
}
}
}
j=c1+1,k=c1+c2+1;
for (i=k;i<=n;i++){
if (a[i]==2){
j=search2(j,3);
a[i]=3;
a[j]=2;
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}