函数 returns for 循环内部的值不正确(但外部的值正确)
Function returns incorrect value inside for loop (but correct value outside)
我正在尝试用 C 编写一个基本的选择排序程序。通过调试,我可以看到在第一个 for 循环(// 交换值)下,selection(nums, size, i).index
return与 i
的值相同。但是,如果我在 for 循环之外使用 完全相同的代码 调用 selection
函数,它将正确地 return 索引(数组中的数字具有最小值并位于给定索引的右侧)。
如何使 selection
return 成为 for 循环中的正确值?
#include <stdio.h>
typedef struct {
int value;
int index;
} sorted;
sorted selection(int integers[], int size, int idx);
int main(void) {
int nums[] = {7, 2, 3, 0, 1, 4, 6, 5};
int size = sizeof(nums)/sizeof(int);
int temp;
// Swap the values
for (int i = 0; i < size; i++) {
temp = nums[i];
nums[i] = selection(nums, size, i).value;
nums[selection(nums, size, i).index] = temp;
}
// Print the array
printf("[");
for (int j = 0; j < size; j++) {
if (!(j == size - 1)) {
printf("%i ", nums[j]);
}
else {
printf("%i", nums[j]);
}
}
printf("]\n");
}
sorted selection(int arr[], int size, int start) {
sorted smallest;
for (int i = start; i < size; i++) {
// If first element
if (i == start) {
smallest.value = arr[i];
smallest.index = i;
}
// If smaller
else if (arr[i] < smallest.value) {
smallest.value = arr[i];
smallest.index = i;
}
}
return smallest;
}
您需要更改循环“//交换值”
// Swap the values
for (int i = 0; i < size; i++)
{
sorted select = selection(nums, size, i);
temp = nums[i];
nums[i] = select.value;
nums[select.index] = temp;
}
您的版本失败的原因是您在开始修改数组后第二次调用 selection
,而在第一次调用后只需要保留索引。
正如@WhozCraig 指出的那样,sorted
和 selection
的使用完全没有必要。您还按值传递了 sorted
,这不是 C 中的约定。
我已重命名该函数以表明其用途。这可以简化为仅获取当前索引的元素,但是在处理 return 值时需要进行一些额外的调整,因此需要权衡。
#include <stdio.h>
int indexOfSmallest(int integers[], int size, int idx);
int main(void) {
int nums[] = {7, 2, 3, 0, 1, 4, 6, 5};
int size = sizeof(nums)/sizeof(int);
int temp;
// Swap the values
for (int i = 0; i < size; i++) {
temp = nums[i];
int smallest = indexOfSmallest(nums, size, i);
nums[i] = nums[smallest];
nums[smallest] = temp;
}
// Print the array
printf("[");
for (int j = 0; j < size; j++) {
if (!(j == size - 1)) {
printf("%i ", nums[j]);
}
else {
printf("%i", nums[j]);
}
}
printf("]\n");
}
int indexOfSmallest(int arr[], int size, int start) {
int smallest = start;
for (int i = start; i < size; i++) {
if (arr[i] < arr[smallest]) {
smallest = i;
}
}
return smallest;
}
我正在尝试用 C 编写一个基本的选择排序程序。通过调试,我可以看到在第一个 for 循环(// 交换值)下,selection(nums, size, i).index
return与 i
的值相同。但是,如果我在 for 循环之外使用 完全相同的代码 调用 selection
函数,它将正确地 return 索引(数组中的数字具有最小值并位于给定索引的右侧)。
如何使 selection
return 成为 for 循环中的正确值?
#include <stdio.h>
typedef struct {
int value;
int index;
} sorted;
sorted selection(int integers[], int size, int idx);
int main(void) {
int nums[] = {7, 2, 3, 0, 1, 4, 6, 5};
int size = sizeof(nums)/sizeof(int);
int temp;
// Swap the values
for (int i = 0; i < size; i++) {
temp = nums[i];
nums[i] = selection(nums, size, i).value;
nums[selection(nums, size, i).index] = temp;
}
// Print the array
printf("[");
for (int j = 0; j < size; j++) {
if (!(j == size - 1)) {
printf("%i ", nums[j]);
}
else {
printf("%i", nums[j]);
}
}
printf("]\n");
}
sorted selection(int arr[], int size, int start) {
sorted smallest;
for (int i = start; i < size; i++) {
// If first element
if (i == start) {
smallest.value = arr[i];
smallest.index = i;
}
// If smaller
else if (arr[i] < smallest.value) {
smallest.value = arr[i];
smallest.index = i;
}
}
return smallest;
}
您需要更改循环“//交换值”
// Swap the values
for (int i = 0; i < size; i++)
{
sorted select = selection(nums, size, i);
temp = nums[i];
nums[i] = select.value;
nums[select.index] = temp;
}
您的版本失败的原因是您在开始修改数组后第二次调用 selection
,而在第一次调用后只需要保留索引。
正如@WhozCraig 指出的那样,sorted
和 selection
的使用完全没有必要。您还按值传递了 sorted
,这不是 C 中的约定。
我已重命名该函数以表明其用途。这可以简化为仅获取当前索引的元素,但是在处理 return 值时需要进行一些额外的调整,因此需要权衡。
#include <stdio.h>
int indexOfSmallest(int integers[], int size, int idx);
int main(void) {
int nums[] = {7, 2, 3, 0, 1, 4, 6, 5};
int size = sizeof(nums)/sizeof(int);
int temp;
// Swap the values
for (int i = 0; i < size; i++) {
temp = nums[i];
int smallest = indexOfSmallest(nums, size, i);
nums[i] = nums[smallest];
nums[smallest] = temp;
}
// Print the array
printf("[");
for (int j = 0; j < size; j++) {
if (!(j == size - 1)) {
printf("%i ", nums[j]);
}
else {
printf("%i", nums[j]);
}
}
printf("]\n");
}
int indexOfSmallest(int arr[], int size, int start) {
int smallest = start;
for (int i = start; i < size; i++) {
if (arr[i] < arr[smallest]) {
smallest = i;
}
}
return smallest;
}