下面是用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 数组进行排序

求数组排序的最小交换次数给我c++代码

原文地址: https://www.cveoy.top/t/topic/hZUb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录