PAT 1066

题目 : Sort with Swap(0,*)

分值 : 25
难度 : 贪心题
思路 : 你用一个 list[value] = index 的数组反向记录下 每一个value所处的下标 index
       然后每次都去取出 list[0] , 比如list[0] =7,你就和 list[7]交换以保证list[7]
       中的数字是最终的数字,也就是list[7]=7.这样的解法会出现list[0]=2/ list[2]=0 
       这样就需要去遍历 整个list数组,找到一个还未是最终数字的list[i]和list[0]交换.
坑点 : 在碰到list[0]=0 去遍历数组时,如果你每次都是从头开始找,那么会超时. 
       优化方法:每次从上次寻找的下标开始找,因为上次找过的下标之前肯定已经都排好序了.

具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
using namespace std ;
int data[100001];
int list[100001];
int main() {
int N ;
cin >> N ;
int count = 0 ;
for(int i = 0 ; i< N ; i++)
{
int temp ;
scanf("%d",&temp) ;
data[i] = temp ;
list[temp] = i ;
}
bool flag ;
int old =1 ;
while (true)
{
if(list[0]!=0)
{
count ++ ;
int next = list[0] ;
int v = list[next] ;
list[0] = v;
list[next] = next ;
}
else
{
flag = true ;
for(int i =old ; i< N ; i++)
{
if(list[i]!=i)
{
list[0] =list[i] ;
list[i] = 0 ;
count ++ ;
flag =false ;
old = i ;
break ;

}
}
if(flag)
break ;
}
}
cout <<count <<endl ;

}