找出交换的最小数目以降序对数组进行排序(可能在C / C ++中)

时间:2019-05-21 16:44:21

标签: c++ algorithm

给定一个整数数组,我们必须找到按降序对数组进行排序所需的最小交换次数。我们可以在最佳解决方案中做到甚至优于O(n ^ 2)吗?

例如:输入数组:[1234]。 输出:交换次数:2

说明: ([1234] -> [4231] -> [4321]).

  • 首先,我们交换元素41
  • 第二,我们交换元素23以获得降序。

只需修改此问题:https://www.geeksforgeeks.org/minimum-number-swaps-required-sort-array/

我的代码如下:

vector<int> v[1000];
bool visit[1000];

// This function will return the size of the cycle.
int graphsize(int i)
{
    visit[i] = true;
    int s = 1;

    for(auto x: v[i])
        if(!visit[x])
            s += graphsize(x);

    return s;  
}

int minSwaps(vector<int> popularity) {

    for(int i =popularity.size(); i>0; i-- )
        v[i].push_back(popularity[i]-1), v[popularity[i]-1].push_back(i);

    int swaps = 0;

sort(popularity.begin(), popularity.end(), greater<int>()); // Sort in descending order


    for(int i = popularity.size(); i>0 ;i--)
    {
        if(!visit[i])
            swaps += graphsize(i) - 1;
    }

    return swaps;
}

执行此操作时出现分段错误。 有人可以告诉我这段代码在哪里出问题吗?

0 个答案:

没有答案