【问题标题】:Minimum number of swaps to sort an array with no duplicates对没有重复的数组进行排序的最小交换次数
【发布时间】:2020-05-04 15:17:16
【问题描述】:

我想找到对数组进行排序的最小交换次数。 (保证数组没有重复。)我发现一个帖子基本上使用图表来做到这一点:Compute the minimal number of swaps to order a sequence

但我想知道我是否也可以通过运行选择排序并计算交换次数来做到这一点。 (见下面的代码。)这种方法正确吗?或者有没有会给出错误结果的情况?

int minSwaps(int[] A, int n) {
    int numSwaps = 0;
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (A[j] < A[minIndex])
                minIndex = j;
        }
        if (minIndex != i) {
            numSwaps++;
            int temp = A[minIndex];
            A[minIndex] = A[i];
            A[i] = temp;
        }
    }
    return numSwaps;
}

【问题讨论】:

    标签: algorithm sorting


    【解决方案1】:

    你的方法是正确的。作为维基百科explains

    选择排序与其他排序算法的区别在于,它使交换次数尽可能少,n - 1 在最坏的情况下。

    即使数组可以包含重复项也是如此。

    实际上,您的方法只是the question you link to 方法的一个特例。这个问题实际上并没有使用图表。答案只是使用图论来尝试证明该方法有效。所以那里的论点同样适用于你的方法。

    也就是说,您的确切方法需要 O(n2) 比较,而这种方法的其他变体只需 O(n em> 记录 n) 时间。只有您可以决定变体的简单性是否值得更大的时间复杂度。

    【讨论】:

    • 感谢您的确认,我只是想知道这种选择排序方法是否会在某些情况下失败。
    • @NitinSinghal:是的,我知道。但我认为你会欣赏更多的信息。 :-)
    • 我注意到另外一件事,如果元素不在 [1,2,3....n] 中,则上述图论方法将失败,但这种选择排序方法将起作用
    • @NitinSinghal:这种选择排序方法是该问题方法的一个特例;因此,如果选择排序方法适用于任意数组(并且确实如此),那么该问题中的方法也是如此。
    猜你喜欢
    • 2019-08-08
    • 2015-01-06
    • 2013-02-15
    • 2018-07-08
    • 2017-01-09
    • 2015-02-18
    • 2016-07-13
    • 1970-01-01
    相关资源
    最近更新 更多