PAT 1067. Sort with Swap(0,*)
1067. Sort with Swap(0,*) (25)
Given any permutation of the numbers {0, 1, 2,..., N-1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:
Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.
Input Specification:
Each input file contains one test case, which gives a positive N (<=105) followed by a permutation sequence of {0, 1, ..., N-1}. All the numbers in a line are separated by a space.
Output Specification:
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
Sample Input:10 3 5 7 2 6 4 9 0 8 1Sample Output:
9
一开始按照选择排序做了, 结果有两个测试点超时, 看看网上的思路基本上都是判断是否被访问的算法,想了想这个应该是表排序的变形,就按照表排序方式做了,花了一下午调试 果然AC了, 特地来交流 ^_^!
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType; 5 6 void Swap(ElementType *a, ElementType *b); 7 void PrintA(ElementType A[], int N); 8 int IsSort( ElementType A[], int m, int N); 9 void SwapZero( ElementType A[], ElementType B[], int N); 10 11 typedef struct { 12 int index;//0元素所在下标 13 int count;//记录交换次数 14 }Zero; 15 16 Zero zero; 17 18 int main(){ 19 int N, i; 20 zero.count = 0; 21 //freopen("C:\\in.txt","r", stdin); 22 scanf("%d", &N); 23 ElementType* A;//这个是原来的数组 24 A = (ElementType*)malloc(N*sizeof(ElementType)); 25 ElementType* B;//这个是表 26 B = (ElementType*)malloc(N*sizeof(ElementType)); 27 for( i=0; i<N; i++){ 28 scanf("%d", &A[i]); 29 B[A[i]] = i;//记录A[i]所在的位置 30 if(A[i] == 0) 31 zero.index = i; 32 } 33 SwapZero(A, B, N); 34 printf("%d\n", zero.count); 35 return 0; 36 } 37 38 int IsSort( ElementType A[], int m, int N){ 39 int i; 40 int flag = 0; 41 for(; m<N; m++ ){ 42 if( m != A[m] ) { 43 flag = m; 44 break; 45 } 46 } 47 return flag; 48 } 49 50 void SwapZero( ElementType A[], ElementType B[], int N){ 51 int i, m = 1; 52 for( ; ; ){ 53 if( zero.index != 0 ){//交换swap(0,i); 54 Swap( &A[zero.index], &A[B[zero.index]]); 55 B[0] = B[zero.index]; 56 B[A[zero.index]] = zero.index;//更新表 57 zero.index = B[0]; 58 zero.count++; 59 } else if( m=IsSort(A, m, N)){ //找到第一个位置不对的数字交换 60 Swap( &A[zero.index], &A[m]);//交换,更新表 61 B[zero.index] = m; 62 B[A[zero.index]] = 0; 63 zero.index = B[zero.index]; 64 zero.count++; 65 } else break; 66 } 67 } 68 69 70 void Swap(ElementType *a, ElementType *b){ 71 int tmp; 72 tmp = *a; 73 *a = *b; 74 *b = tmp; 75 }