首先读入数组,将数组和排好序的数组进行比较,nij表示应该在i的地方放置的是j的个数。
先将1放入应该在的位置,需要n12+n13次交换,然后将3放入应该在的位置,注意,n13中一些3被交换到2或者在处理1的时候已经交换到3,所以交换3就是n23+max(0,n13-n31).
/*
ID:Ryan
PROG:sort3
LANG:C++
*/
#include 
<iostream>
#include 
<fstream>
#include 
<memory.h>
#include 
<cmath>
#include 
<algorithm>
using namespace std;
ifstream fin (
"sort3.in");
ofstream fout (
"sort3.out");  

int main()
{   
    ifstream fin (
"sort3.in");
    ofstream fout (
"sort3.out");  
    
int a[1001];
    
int nn[4]={0,0,0,0};
    
int n13=0,n23=0,n12=0,n31=0,n32=0,n21=0;
    
int i,sum=0,n;
    fin
>>n;
    
for(i=1;i<=n;i++)
    {
        fin
>>a[i];
        nn[a[i]]
++;
    }
    
for(i=1;i<=nn[1];i++)
    {
        
if(a[i]==2) n12++;
        
if(a[i]==3) n13++;
    }
    
for(i=nn[1]+1;i<=nn[1]+nn[2];i++)
    {
        
if(a[i]== 1) n21++;
        
if(a[i]== 3) n23++;
    }
    
for(i=nn[1]+nn[2]+1;i<=n;i++)
    {
        
if(a[i]== 1) n31++;
        
if(a[i]== 2) n32++;
    }
    
int t;
    fout
<<n21+n31+n23+max(0,n13-n31)<<endl;
   
//system("PAUSE");
    return 0;
}