【问题标题】:Issue with selection sort and using a findMin method in C选择排序问题和在 C 中使用 findMin 方法
【发布时间】:2014-12-18 16:39:28
【问题描述】:

所以我在 C 中创建的选择排序存在问题。当在一个函数中实现时,我可以让选择排序工作。但是,当我按照我的任务要求进行操作并使用 findMin 函数返回数组的最小索引时,它并没有完全排序。我尝试使用打印语句对其进行调试,但我似乎无法弄清楚出了什么问题。

这是我使用 findMin 方法的排序方法:

void sortMin2(int A[]) {
    int outer;
    int minIndex;
    for(outer = 0; outer < 5; outer++) {
        minIndex = findMin(A, outer, 5);
        if(minIndex != outer) {
                swap(&A[minIndex], &A[outer]);
        }//end if
    } // end for
}

int findMin(int A[], int i, int j) {
    int k; // for loop
    int index = 0;
    for(k = (i + 1); k < (j+1); k++) {
        if(A[k] < A[index]) {
            index = k;
        } // end if
    } // end for
    return index;
} // end findMin

void swap(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
} // end swap

这是我在一个包含五个值的数组上运行它时的输出:

Array Before: 4, 10, 9, 1, 3, 
4, 10, 9, 1, 3, 
1, 10, 9, 4, 3, 
10, 1, 9, 4, 3, 
10, 1, 3, 4, 9, 
10, 1, 3, 9, 4, 
Array after: 4, 1, 3, 9, 10, 

现在,这是我的选择排序方法,它确实有效(即正确排序)。

void selectionSort2(int A[]) {
    int outer; // for loops
    int inner;
    int minimum = 0;
    //int minIndex = 0;
    for(outer = 0; outer < 5; outer++) {
        //minIndex = findMin(A, 0, 19);
        minimum = outer;
        for(inner = outer + 1; inner < 5; inner++) {
            if(A[minimum] > A[inner]) {
                minimum = inner;
            } // end if
        } // end inner for

        if(minimum != outer) {
            swap(&A[minimum], &A[outer]);
        } // end if
    } // end outer for
}

有人知道为什么我的 sortMin2 函数实际上没有排序吗?

【问题讨论】:

  • 鉴于你有一套工作代码,你应该逐行比较坏代码和好代码,并在每一行问自己,“这两行代码是否完全相同事情,如果不是,为什么不呢?”
  • 我试图追踪它并找出它为什么不工作/做同样的事情。但我真的想不通:(也许我看得太久了
  • 我要做的第一件事是使所有变量名匹配。在工作代码中,您有变量outerinnerminimumfindMin 函数应该具有完全相同的变量。唯一奇怪的是名为j 的参数,它对应于工作代码中的数字5。您需要为该参数提供一个描述性名称,例如arraySizesizelength。但是所有其他参数和变量可以/应该与工作代码中的名称完全相同。然后findMin 中的代码应该与工作代码相同。
  • 为什么在findMin(...) 方法中,for 循环以k &lt; (j+1) 作为终止条件。你不觉得,应该是k &lt; j吗?由于j + 1 将导致6,因此循环将一直到j = 5,这将导致未定义的行为。
  • 在我的指导下,它说用户应该从 A[i] 输入到 A[j],所以如果我做了 k

标签: c sorting selection-sort


【解决方案1】:

代码中的一些东西在正确的意义上是不正确的。

为什么在findMin(...) 方法中,for 循环以k &lt; (j+1) 作为终止条件。你不觉得,应该是k &lt; j吗?由于j + 1 将导致6,因此循环将一直到j = 5,这将导致未定义的行为(因为它超过了数组A的边界)。数组索引从0 开始。由于大小为5,因此索引在0 - 4 的范围内。

此外,index 的值永远不会改变。在每次迭代中,它总是从0 开始。相反,它应该是int index = i,在findMin(...) 函数中,就像在Selection Sort 中我们找到最小的元素,并将它放在左侧,到它的正确位置,因此下一次,我们从一个地方开始,一个在这个位置之前。

sortMin2(...) 函数中,你未能调用swap(...),以防你有新的索引来交换值。

这里是 sn-p 的修改版本:

int findMin(int A[], int i, int j) {
    int k; // for loop
    int index = i;
    for(k = (i + 1); k < (j); k++) {
        if(A[k] < A[index]) {
            index = k;
        } // end if
    } // end for
    return index;
} // end findMin

void swap(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
} // e

void display(int A[])
{
    int i = 0;
    for (i = 0; i < 5; ++i)
        printf("%d\t", A[i]);
    printf("\n");
}

void sortMin2(int A[]) {
    int outer = 0;
    int minIndex = -1;
    for(outer = 0; outer < 5; outer++) {
        minIndex = findMin(A, outer, 5);
        if(minIndex != outer) {
            swap(&A[minIndex], &A[outer]);
            display(A);
        }//end if
    } // end for
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2011-01-28
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多