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

来源:互联网 发布:开源的网管软件 编辑:程序博客网 时间:2024/06/05 03:18
//表排序/*题意:给定N个数字的排列,利用与0的交换来排序,引理:N个数字的排列有若干个独立的环组成,环分为三种:1.只含一个元素:无需交换2.环中有0:只需n-1次交换3.环中无0:需要先把0换到环中,在进行n+1次交换*/#include <stdio.h>#define maxn 100005int 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);}