#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 100010;
int a[MAXN]; //存放各个数字当前所处的位置编号
int main(){
int n, num, ans = 0;//表示总计交换次数
scanf("%d", &n);
int surplus = n - 1;//存放除0以外不在本位上的数的个数
for(int i = 0; i < n; i++){
scanf("%d", &num);
a[num] = i; //num所处的位置为i
if(num == i && num != 0)//除了零,在本位上的数
surplus--;
}
int k = 1; //k存放除了0以外当前不在本位上的最小的数
while(surplus > 0) {//只要有数还不在本位上
//如果0在本位上,则寻找一个当前不在本位上的数与0交换
if(a[0] == 0) {
while(k < n) {
if(a[k] != k) { //找到一个当前不在本位上的数k
swap(a[0], a[k]); //k与0交换位置
ans++; //交换次数加1
break; //退出循环
}
k++; //判断k+1是否在本位
}
}
//只要0不在本位,就将0所在位置的数的当前所处位置与0交换
while(a[0] != 0) {
swap(a[0], a[a[0]]); //0与a[0]交换
ans++; //交换次数加1
surplus--; //不在本位上的数的个数减1
}
}
printf("%d", ans);
return 0;
}
原文地址:https://www.cnblogs.com/zjsaipplp/p/10425233.html
时间: 2024-11-01 11:05:39