题目要求:
- 给出【0,N-1】范围内的乱序数组,要求在只能交换0和其他数字的情况下,完成数组的排序。
注意:
- 因为是swap,所以直接记录位序比较方便
- 刚开始有两个测试点超时,改了一下代码,设置一个变量,记录目前尚未排序的最小数字的位序。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100010;
int pos[maxn]={-1};
int main()
{
int n,count=0; // count记录交换次数
scanf("%d",&n);
int left = n-1; //left记录除了0以外目前有多少个不在本位上的数
for(int i=0;i<n;i++)
{
int t;
scanf("%d",&t);
pos[t]=i;
if(pos[t]==t&&t!=0)
left--;
}
int k=1; //k记录除了0之外不在本位上的最小数的位置
while(left>0)
{
if(pos[0]==0)
{
while(k<n)
{
if(pos[k]!=k)
{
swap(pos[0],pos[k]);
count++;
break;
}
k++;
}
}
else
{
swap(pos[0],pos[pos[0]]);
count++;
left--;
}
}
printf("%d",count);
return 0;
}