【问题标题】:Recursive selection sort outputting incorrect values in C递归选择排序在C中输出不正确的值
【发布时间】:2018-08-09 02:32:28
【问题描述】:

我一直在研究递归版本的选择排序。 MaxInd 在 SelectionSort 的一次迭代中运行良好,但是一旦我使 SelectionSort 递归,MaxInd 在 SelectionSort 的第一次迭代后开始产生不正确的值,这导致我的代码交换了不正确的值。我不确定它为什么会这样。

#include <stdio.h>

int MaxInd(int arr[], int i, int len, int max, int index){
    if (arr[i]>max){
        max=arr[i];
        index=i;
    }
    if(i==len)
        return index;

    index = MaxInd(arr,i+1,len,max,index);
    return index;
}
void SelectionSort(int arr[], int len){
    int index=0; int max=0; int i=0; int temp=0; int num=0;
    if(len<0){
        for(int j=0; j<6; j++)
            printf("array=%d\n",arr[j]);
            return;
    }
    num = MaxInd(arr, i, len, max, index);
    if(len>0){
        temp=arr[len-1];
        arr[len-1]=arr[num];
        arr[num]=temp;
    for(int j=0; j<6; j++)
            printf("%d ",arr[j]);
        printf("\n");
    }
    return SelectionSort(arr,len-1);
}
int main(void){
    int arr[6] = {1,4,3,7,9,2};
    int len=sizeof(arr)/sizeof(arr[0]);
    SelectionSort(arr, len);
}

【问题讨论】:

  • 忘记从SelectionSort返回 - 现在使用它的值的未定义行为。
  • 你到底是什么意思?我在内部调用它后尝试添加一个返回,但它没有改变任何东西。
  • SelectionSort()return 0; 的缩进不正确。在SelectionSort() 末尾没有返回的事实是有问题的。尚不清楚返回值应该是什么;排序后的数组中的值数应与输入数组中的值相同,除非您要挤出重复项。

标签: c recursion selection-sort


【解决方案1】:

处理return语句的正确方法是这样写

return SelectionSort(arr,len-1);

你应该从函数返回一个int - 但你没有放任何return 语句 - 然后你再次尝试使用它的值。这是undefined behavior

这将确保 - 在它到达递归调用的底部后,它将正确返回返回的值,以便后续的父函数获取它。不要忘记return 只是终止函数的执行并将控制权返回给调用函数。

还请注意 - 排序函数通常不返回任何内容(void 返回类型) - 但在这种情况下,在完成所有工作之后,您返回的只是0。所以它给我们留下了一个问题 - 您返回的值是否正确?

您的maxInd 函数也会在第一次调用中返回6 - 这是错误的。它不能是 中长度为 6 的数组中的有效索引,因为数组索引是基于 的 0。否则,您将在代码上调用 Undefined Behavior。正确的顺序是 - 首先检查它(index)是否越界,如果是,则在这种情况下返回index,否则通过连续调用来寻找它。

if(i == len)
    return index;

if (arr[i] > max){
    max = arr[i];
    index = i;
}

只是更正代码 - 给出正确的结果。(从代码中删除未定义的行为)(正确的结果是指它对数组进行排序,但您最不关心它)。 Here.

正如 Jonathan Leffler 所提到的,您的代码中的缩进具有误导性。编译器生成的消息是[-Werror=misleading-indentation],您应该相应地对待它。您可以看到适当的缩进如何消除此错误。

【讨论】:

  • 谢谢。我没有意识到我应该把底座放在前面。下次我也会确保检查我的缩进。我还记得这本来应该是一个 void 函数,我只是将它设为 int 以便我可以测试值,但一切似乎仍然正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
相关资源
最近更新 更多