我一直在研究选择排序的递归版本。 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);
}
答案 0 :(得分:3)
处理return
语句的正确方法是将其写为
return SelectionSort(arr,len-1);
你应该从函数中返回int
- 但你没有发表任何return
声明 - 然后你再次尝试使用它的值。这是undefined behavior。
这将确保 - 在它到达递归调用的底部之后,它将返回正确返回的值,以便连续的父函数得到它。不要忘记return
只是终止函数的执行并将控制权返回给调用函数。
另请注意 - 排序函数通常不会返回任何内容(void
返回类型) - 但在这种情况下,在完成所有工作后,您将返回除0
之外的其他内容。 。所以它给我们留下了一个问题 - 你回来的正确值是什么?
同样,您的maxInd
函数会在第一次调用中返回6
- 这是错误的。它不能是c中长度6
数组中的有效索引,因为数组索引基于0 c。否则,您将在代码上调用Undefined Behavior。正确的顺序是 - 首先检查它(index
)是否超出范围,如果是,那么在那种情况下返回index
否则通过连续调用来寻找它。
if(i == len)
return index;
if (arr[i] > max){
max = arr[i];
index = i;
}
只是纠正代码 - 给出正确的结果。(从代码中删除未定义的行为)(通过正确的结果我的意思是它对数组进行排序,但你最不关心它)。 Here.
同样,Jonathan Leffler提到,你的代码中的缩进是误导性的。编译器生成的消息是[-Werror=misleading-indentation]
,您应该相应地对待它。你可以看到适当的缩进如何使这个错误消失。