用一个unordered_map
来记录每个元素的下标。
注意不要暴力查找还没排序的value。
#include<iostream>
#include<unordered_map>
using namespace std;
unordered_map<int, int> indexes;
int unsortedNum = 1;
int getUnsortedValue() { //don't traverse from the beginning!
while (indexes[unsortedNum] == unsortedNum)
unsortedNum++;
return unsortedNum;
}
int main() {
int n;
cin >> n;
int swapCount = 0;
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
indexes[num] = i;
}
while (true) {
int zeroIndex = indexes[0];
while (zeroIndex != 0) {
int index = indexes[zeroIndex];
indexes[zeroIndex] = zeroIndex;
indexes[0] = index; //update 0's index
zeroIndex = index;
swapCount++;
}
int val = getUnsortedValue();
if (val >= n) {
cout << swapCount << endl;
return 0;
}
indexes[0] = indexes[val];
indexes[val] = zeroIndex;
swapCount++;
}
}