【发布时间】: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 函数实际上没有排序吗?
【问题讨论】:
-
鉴于你有一套工作代码,你应该逐行比较坏代码和好代码,并在每一行问自己,“这两行代码是否完全相同事情,如果不是,为什么不呢?”
-
我试图追踪它并找出它为什么不工作/做同样的事情。但我真的想不通:(也许我看得太久了
-
我要做的第一件事是使所有变量名匹配。在工作代码中,您有变量
outer、inner和minimum。findMin函数应该具有完全相同的变量。唯一奇怪的是名为j的参数,它对应于工作代码中的数字5。您需要为该参数提供一个描述性名称,例如arraySize、size或length。但是所有其他参数和变量可以/应该与工作代码中的名称完全相同。然后findMin中的代码应该与工作代码相同。 -
为什么在
findMin(...)方法中,for循环以k < (j+1)作为终止条件。你不觉得,应该是k < j吗?由于j + 1将导致6,因此循环将一直到j = 5,这将导致未定义的行为。 -
在我的指导下,它说用户应该从 A[i] 输入到 A[j],所以如果我做了 k
标签: c sorting selection-sort