递归选择排序在C中输出不正确的值

问题描述 投票:1回答:1

我一直在研究选择排序的递归版本。 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);
}
c recursion selection-sort
1个回答
3
投票

处理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],你应该相应地对待它。您可以看到正确的缩进如何使此错误消失。

© www.soinside.com 2019 - 2024. All rights reserved.