递归选择排序在C中输出不正确的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归选择排序在C中输出不正确的值相关的知识,希望对你有一定的参考价值。
我一直在研究选择排序的递归版本。 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
",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("
");
}
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);
}
处理return
语句的正确方法是将其写成这样
return SelectionSort(arr,len-1);
你应该从函数中返回一个int
- 但你没有放任何return
语句 - 然后你再次试图使用它的值。这是undefined behavior。
这将确保 - 在它到达递归调用的底部之后,它将返回正确返回的值,以便连续的父函数得到它。不要忘记return
只是终止函数的执行并将控制权返回给调用函数。
另请注意 - 排序函数通常不返回任何内容(void
返回类型) - 但在这种情况下,在完成所有工作后,您将返回除0
之外的其他内容。所以它给我们留下了一个问题 - 你回来的正确价值是什么?
你的maxInd
函数也会在第一次调用中返回6
- 这是错误的。它不能是6
中长度为c数组的有效索引,因为数组索引是基于c的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]
,你应该相应地对待它。您可以看到正确的缩进如何使此错误消失。
以上是关于递归选择排序在C中输出不正确的值的主要内容,如果未能解决你的问题,请参考以下文章
8种面试经典!排序详解--选择,插入,希尔,冒泡,堆排,3种快排,快排非递归,归并,归并非递归,计数(图+C语言代码+时间复杂度)
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)