10-排序6
10-排序6 Sort with Swap(0, i)(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 1
Sample Output:
9
题目没看仔细,是0-N-1,不用排序的,所以给排了序。自己开始写的代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int n,last = 0;
struct book{
int sorted;
int index;
};
int cmp(book a,book b){
return a.sorted < b.sorted;
}
int findNext(book books[]){
while(last < n && books[last].sorted < 0) last++;
return last;
}
int main(){
int i,next,cnt = 0,cntNoMove = 0;
cin>>n;
if(n == 1){
cout<<0<<endl;
return 0;
}
book books[n];
int A[n];
for(i=0;i<n;i++){
cin>>A[i];
books[i].sorted = A[i];
books[i].index = i;
}
sort(books,books + n,cmp);
for(i=0;i<n;i=next){
if(books[i].sorted == A[i]){
books[i].sorted = -2;
next = findNext(books);
cntNoMove++;
}
else if(books[i].sorted >= 0){
books[i].sorted = -1;
next = books[i].index;
}
else if(books[i].sorted == -1){
cnt++;
next = findNext(books);
last = next;
if(next == n) break;
}
}
if(A[0] == 0) cout<<n - cntNoMove + cnt<<endl;
else cout<<n - cntNoMove + cnt - 2<<endl;
return 0;
}
借鉴别人的代码如下:
#include<stdio.h>
#define Max 100000
int main()
{
int A[Max],Table[Max],flag[Max],N;
int i,tmp,S,K;
S=K=0;
scanf("%d",&N);
for (i=0;i<N;i++)
{
scanf("%d",&A[i]);
flag[i]=0; //标识元素访问过了没有
}
/* 指针数组,用来存放正确的序号 */
for (i=0;i<N;i++)
{
Table[A[i]]=i; //即元素A[i]存放在序号i中
}
for (i=0;i<N;i++)
{
if (flag[i]==0)
{
if (Table[i]!=i)
{
flag[i]=1;
tmp=Table[i];
while(flag[tmp]==0)
{
flag[tmp]=1;
tmp=Table[tmp];
}
K++;
}
else if (Table[i]==i)
{
flag[i]=1;
S++;
}
}
}
if (A[0]==0)printf("%d",N-S+K);
else if (S==N)printf("0");
else printf("%d",N-S+K-2);
return 0;
}
Email:JingwangLi@outlook.com