雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

无序数 按升序排序需要换几次

Posted on 2011-07-15 13:59  huhuuu  阅读(239)  评论(0编辑  收藏  举报
输入n
然后n个数字
输出需要换几次
View Code
#include<cstdio>
#include
<iostream>
#include
<algorithm>
using namespace std;

struct data
{
int val;
int no;
int N;
}a[
500009];

int hash[500009];

int cmp(data a,data b)
{
return a.val<b.val;
}

int cmp1(data a,data b)
{
return a.no<b.no;
}

int main()
{
int n;
while(scanf("%d",&n),n)
{
int i;
for(i=1;i<=n;i++)
{
scanf(
"%d",&a[i].val);
a[i].no
=i;
}

sort(
&a[1],&a[n+1],cmp);
for(i=1;i<=n;i++)
{
a[i].N
=i;
}
sort(
&a[1],&a[n+1],cmp1);

for(i=1;i<=n;i++)
{
hash[a[i].no]
=a[i].N;
}

int all=0;
for(i=1;i<=n;i++)
{
int add=0;
int temp=i;
while(hash[a[temp].no]!=-1&&hash[a[temp].no]!=a[temp].no)
{
int re=hash[a[temp].no];
hash[a[temp].no]
=-1;
temp
=re;
add
++;
}
if(add>=1)
all
+=add-1;
}
printf(
"%d\n",all);
}
}