一、思路
1、基本思路:
模拟题目所述过程,每次使0与一个被0占据最终位置的元素交换,即交换一个元素至最终位置,从而使元素有序;
2、核心函数:
构造数组pos[N], pos[i]表示数字i所在的位置;
swap_0(pos, cnt);
/*
每轮迭代前,可以确定pos[0] == 0,即0归位
每轮迭代后,可以保证元素i正确归位
从1至N-1迭代后,可以保证所有元素归位
*/
for( int i = 1; i < N; ++i )
if( pos[i] != i )
{
/*若0归位时仍有元素位置不正确
将0与元素1位置互换
并执行swap(0, *)至0归位
可以证明0归位时定有元素i归位
*/
swap( pos[0], pos[i] );
swap_0(pos, ++cnt);
}
二、代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
void swap_0( vector<int> &pos, int &cnt )
{
while( pos[0] )
{
swap( pos[0], pos[pos[0]] );
++cnt;
}
}
int main()
{
int N, cnt = 0;
scanf("%d", &N);
vector<int> pos(N);
for( int i = 0, key; i < N; ++i )
{
scanf("%d", &key);
pos[key] = i;
}
swap_0(pos, cnt);
for( int i = 1; i < N; ++i )
if( pos[i] != i )
{
swap( pos[0], pos[i] );
swap_0(pos, ++cnt);
}
printf("%d", cnt);
}