the reason of failure:1、交换的值是数组中的值,而不是其下标。
题意:
给一个数N,接下来N行有N个数,这些数是乱序了的1,2,3,问如何用最小的交换次数把他们按升序排序。
thinking:找出所有1次交换就能使得2个数字位子正确的交换,然后剩下的那些数交换需要a/3*2次。
代码:
/*
ID: me
PROG: sort3
LANG: C++
*/
#include<iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int qq[5000];
int find1(int x,int y,int c){
for(int i=x;i<=y;i++)
if(qq[i]==c)return i;
return -1;
}
int main(){
freopen("sort3.in","r",stdin);
freopen("sort3.out","w",stdout);
memset(qq,0,sizeof(qq));
int n,i,j,k,t1,t2,f1,f2;
cin >> n;
int c1=0;
int c2=0;
int c3=0;
k=0;
for(i=0;i<n;i++){
cin >> qq[i];
if(qq[i]==1)c1++;
else if(qq[i]==2)c2++;
else if(qq[i]==3)c3++;}
for(i=0;i<c1;i++){
if(qq[i]==2){
int g1=find1(c1,c1+c2-1,1);
if(g1!=-1){
// cout << i<< "交换" << g1 <<endl;
swap(qq[g1],qq[i]);
k++;
}
}else if(qq[i]==3){
int g1=find1(c2+c1,n,1);
if(g1!=-1){
// cout << i<< "交换" << g1 <<endl;
swap(qq[i],qq[g1]);
k++;
}
}
}
for(i=c1;i<c1+c2;i++)
if(qq[i]==3){
// cout <<i <<"位置"<< endl;
int g1=find1(c1+c2,n-1,2);
if(g1!=-1){
// cout << i<< "2交换" << g1 <<endl;
swap(qq[g1],qq[i]); //1、交换的是代码的值,而不是交换g1与i
k++;
}
}
int g=0;
for(i=0;i<c1;i++)
if(qq[i]!=1)g++;
for(i=c1;i<c1+c2;i++)
if(qq[i]!=2)g++;
for(i=c1+c2;i<n;i++)
if(qq[i]!=3)g++;
// cout << "有错误" <<g <<"个"<< endl;
// cout << c1 << " " << c2 <<" " << c3<< endl;
// for(i=0;i<n;i++)
// cout << qq[i] << endl;
cout << k+g/3*2<<endl;
}