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

递归选择排序在C中输出不正确的值,c,recursion,selection-sort,C,Recursion,Selection Sort,我一直在研究选择排序的递归版本。MaxInd在SelectionSort的一次迭代中工作得很好,但一旦我使SelectionSort递归,MaxInd在SelectionSort的第一次迭代后开始产生错误的值,这导致我的代码交换错误的值。我不知道它为什么这样做 #include <stdio.h> int MaxInd(int arr[], int i, int len, int max, int index){ if (arr[i]>max){ ma

我一直在研究选择排序的递归版本。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);
}
#包括
int MaxInd(int arr[],int i,int len,int max,int index){
如果(arr[i]>最大值){
max=arr[i];
指数=i;
}
如果(i==len)
收益指数;
索引=最大索引(arr,i+1,len,max,index);
收益指数;
}
无效选择排序(整数arr[],整数len){
int index=0;int max=0;int i=0;int temp=0;int num=0;

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

return SelectionSort(arr,len-1);
您应该从函数返回一个
int
,但是您没有放入任何
return
语句,然后再次尝试使用它的值。这是

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

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

另外,您的
maxInd
函数将在第一次调用中返回
6
,这是错误的。在中,它不能是长度
6
数组中的有效索引,因为数组索引是基于0的。否则,您将调用代码。正确的顺序是-首先检查它是否(索引
是基于)如果超出范围,则在这种情况下返回
索引
,否则通过连续调用查找

if(i == len)
    return index;

if (arr[i] > max){
    max = arr[i];
    index = i;
}
只需更正代码-就可以得到正确的结果。(从代码中删除未定义的行为)(所谓正确的结果,我的意思是它会对数组进行排序,但您最不关心它)


正如Jonathan Leffler提到的,代码中的缩进是误导性的。编译器生成的消息是
[-Werror=missibling indentation]
您应该相应地处理它。您可以看到正确的缩进是如何消除此错误的。

忘记从
SelectionSort
-现在使用它的值返回未定义的行为。您确切的意思是什么?我尝试在调用它自身内部后添加一个返回,但它没有改变任何内容。
的缩进返回0;
SelectionSort()中的
不正确。
的末尾没有返回值
有问题。不清楚返回值应该是什么;排序数组中的值的数量应该与输入数组中的值相同,除非您挤出重复的值。谢谢。我没有意识到我应该将基本大小写放在前面。我下次一定要检查缩进。我还记得记住,这本来应该是一个void函数,我只是把它设为int,这样我就可以测试值了,但一切似乎都很好。