Algorithm 对无重复项的数组进行排序的最小交换次数

Algorithm 对无重复项的数组进行排序的最小交换次数,algorithm,sorting,Algorithm,Sorting,我想找到对数组进行排序的最小交换数。(该数组保证不会有重复项。)我发现一篇文章基本上使用了一个图表: 但我想知道我是否也可以通过运行选择排序和计算交换的数量来做到这一点。(参见下面的代码)这种方法正确吗?或者有没有一种情况会给出错误的结果 int minSwaps(int[] A, int n) { int numSwaps = 0; for (int i = 0; i < n - 1; i++) { int minIndex = i; fo

我想找到对数组进行排序的最小交换数。(该数组保证不会有重复项。)我发现一篇文章基本上使用了一个图表:

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

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;
}
intminswaps(int[]A,intn){
int numSwaps=0;
对于(int i=0;i
您的方法是正确的。维基百科:

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

即使数组中可能包含重复项,这也是正确的

事实上,您的方法只是当前方法的一个特例。这个问题实际上并不使用图表;答案只是用图论来证明这种方法是有效的。因此,这里的论点同样适用于你的方法


也就是说,您的确切方法需要O(n2)比较,而此方法的其他变体可以在O(nlogn)时间内完成。只有您才能决定您的变体的简单性是否值得更大的时间复杂性。

您的方法是正确的。维基百科:

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

即使数组中可能包含重复项,这也是正确的

事实上,您的方法只是当前方法的一个特例。这个问题实际上并不使用图表;答案只是用图论来证明这种方法是有效的。因此,这里的论点同样适用于你的方法


也就是说,您的确切方法需要O(n2)比较,而此方法的其他变体可以在O(nlogn)时间内完成。只有您才能决定您的变体的简单性是否值得更大的时间复杂性。

感谢您的确认,我只是想知道这种选择排序方法是否会在某些情况下失败。@NitinSinghal:是的,我知道。但我想你会感激更多的信息我还注意到,如果元素不在[1,2,3….n]中,上述图论方法将失败,但这种选择排序方法将失败work@NitinSinghal:此选择排序方法是该问题中方法的特例;因此,如果选择排序方法适用于任意数组(它确实适用),那么问题中的方法也适用。感谢您的确认,我只是想知道这种选择排序方法在某些情况下是否会失败。@NitinSinghal:是的,我知道。但我想你会感激更多的信息我还注意到,如果元素不在[1,2,3….n]中,上述图论方法将失败,但这种选择排序方法将失败work@NitinSinghal:此选择排序方法是该问题中方法的特例;因此,如果选择排序方法适用于任意数组(它确实适用),那么该问题中的方法也适用。