给你一串数列,你将它排成升序,只能两两交换,
方法,每次讲位置指向一个数,直至找到该位置应该存在的数,然后将找过的数归位,就可以了
#include <iostream>
#include <stdio.h>
#include <cstdlib>
using namespace std;
const int maxn=200000+9;
int num[maxn];
int main()
{
int N;
while(~scanf("%d",&N)&&N)
{
for(int i=1; i<=N; i++)
{
scanf("%d",&num[i]);
}
int k;
int coun=0;
int sizen=0;
for(k=1; k<=N; k++)
if(num[k]!=k)
{
coun=0;
int d=k;
while(k!=num[d])
{
int t=d;
d=num[d];
num[t]=t;
coun++;
}
num[d]=d;
sizen+=coun;
}
printf("%d\n",sizen);
}
return 0;
}