您的位置:首页 > 其它

10-排序6 Sort with Swap(0, i) (25分)

2017-05-29 15:13 429 查看
//表排序
/*
题意:给定N个数字的排列,利用与0的交换来排序,引理:
N个数字的排列有若干个独立的环组成,环分为三种:
1.只含一个元素:无需交换
2.环中有0:只需n-1次交换
3.环中无0:需要先把0换到环中,在进行n+1次交换
*/
#include <stdio.h>
#define maxn 100005

int a[maxn], table[maxn];

int main() {
int N, temp = 0, x = 0, ans = 0;
int i, j, cnt = 0, flag = 0;
scanf("%d", &N);
for(i = 0; i < N; i++) {
scanf("%d", &a[i]);
table[a[i]] = i;
}
for(i = 0; i < N; i++, cnt = 0) {
if(table[i] != i) {
j = i;
temp = a[i];
}
while(table[j] != j) {
if(a[j] == 0) flag = 1;
x = j;
j = table[j];
a[x] = a[j];
table[x] = x;
cnt++;
}
a[x] = temp;
if(cnt) {
if(flag) { ans += cnt-1; flag = 0; }
else ans += cnt+1;
}
}
printf("%d\n", ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PTA