题目
参考:PAT甲级1067 Sort with Swap(0, i):[C++题解]此题不是很懂!!
主要想梳理一下算法思路:
- step1:以0为哨兵,就交换0和0所在位置本来应该放的那个数,直到0就位
- step2:仅有step1,可能会存在0已就位,但数组仍存在部分元素未就位。于是从下标为1开始遍历(经过step1,0肯定已经就位),找到第一个未就位的位置下标,交换0和此位置上的元素,接着按照step1进行下去,知道0再次就位。
- 终止条件:注意到step2中“找到第一个未就位的位置下标”,说明此位置之前的元素均就位(除了后面会“主动”让0不就位),而已就位的元素,在后面的交换中是不受影响的,所以经过step1、step2,已就位的部分是从位置1开始不断接续增长的,当再想找下一个未就位的位置下标发现已经超出数组范围时,终止。
代码:
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
int p[int(1e5+10)];
int temp;
for (int i = 0; i < n; i++) {
cin >> temp;
p[temp] = i; //注意这里,数组存的是位置
}
int res = 0;
for (int i = 1; i < n;) {
while (p[0]) {
swap(p[0], p[p[0]]);
res++;
}
while (i < n && p[i] == i)i++;
//此时0已就位
if(i < n) swap(p[0], p[i]), res++;
}
cout << res << endl;
}