函数 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 指出的那样,sortedselection 的使用完全没有必要。您还按值传递了 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;
}