题目链接
1.0号为哨兵, ⽤哨兵与其他数字交换,使其他数字回到有序的位置(最后有序时所处的位置),则排序完成
2.a[t] = i; 表示t数字当前正在占着哪⼀个位置。 (如果想实时监测每个数字的位置,可以⽤ b 数组 {b[a[i]] = i } 缓存⼀下数据,输出查看的)
3.依次遍历每个位置i,如果当前位置不是与之对应的数字,那么我们让这哨兵来去该数执⾏操作回到正确位置
4.数字如何被哨兵执⾏操作回到序的位置:如果哨兵此时不在⾃⼰有序的位置上,那就,先让哨兵去让他占的那个位置上的真正应该放的数字回到此位置,即交换哨兵和此数字,我们swap(a[0],a[a0]),直到哨兵在交换的过程中回到了⾃⼰的有序位置。字词再次检查该位置是不是应该放的数字(别的数字回到有序位置的时候即哨兵执⾏操作的过程中,有可能让此位置该有的数字回到位置)。如果此位置不是当前数字,那哨兵和他交换swap(a[0],a[i]),就是让他先去哨兵的有序位置待⼀会,等下⼀轮操作,哨兵会把他交换回来的。如果此位置已经是该数字了,那就什么都不做。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, t, cnt = 0, a[100010];
cin >> n;
for (int i = 0; i < n; i++) {
cin >> t;
a[t] = i;
}
for (int i = 1; i < n; i++) {
if (i != a[i]) {
while (a[0] != 0) {
swap(a[0], a[a[0]]);
cnt ++;
}
if ( i != a[i] ) {
swap(a[0], a[i]);
cnt ++;
}
}
}
cout << cnt ;
return 0;
}