求数组排序的最小交换次数给我c++代码
下面是用C++编写的代码,用于计算数组排序的最小交换次数:
#include <iostream>
#include <vector>
#include <algorithm>
int minSwaps(std::vector<int>& nums) {
std::vector<std::pair<int, int>> arrPos(nums.size());
for (int i = 0; i < nums.size(); i++) {
arrPos[i].first = nums[i];
arrPos[i].second = i;
}
std::sort(arrPos.begin(), arrPos.end(), [](const std::pair<int, int>& a, const std::pair<int, int>& b) {
return a.first < b.first;
});
std::vector<bool> visited(nums.size(), false);
int minSwaps = 0;
for (int i = 0; i < nums.size(); i++) {
if (visited[i] || arrPos[i].second == i) {
continue;
}
int cycleSize = 0;
int j = i;
while (!visited[j]) {
visited[j] = true;
j = arrPos[j].second;
cycleSize++;
}
if (cycleSize > 0) {
minSwaps += cycleSize - 1;
}
}
return minSwaps;
}
int main() {
std::vector<int> nums = {4, 3, 2, 1};
int minSwaps = minSwaps(nums);
std::cout << "Minimum swaps required: " << minSwaps << std::endl;
return 0;
}
这段代码首先创建了一个 arrPos 数组,用于存储数组元素和对应的下标。然后对 arrPos 数组进行排序,以便按升序排列元素。
接下来,使用 visited 数组来跟踪是否已经访问过某个元素。然后遍历数组中的每个元素,如果已经访问过或者当前元素已经在正确的位置上,则跳过。否则,开始一个新的循环,计算循环的大小,并将循环大小减去1添加到 minSwaps 变量中。
最后,返回 minSwaps 变量的值,即为最小交换次数。
在上述代码中,我们使用了 std::vector 来存储数组元素和中间结果。同时,使用了标准库中的 std::sort 算法对 arrPos 数组进行排序
原文地址: https://www.cveoy.top/t/topic/hZUb 著作权归作者所有。请勿转载和采集!