所以我的递归选择排序调用两个函数max_index和交换,同时它应该递归交换东西,但由于某种原因它似乎破坏并爆炸成某些数组,如我在主设置的那个。有谁知道为什么会这样?有人可以解释并告诉我为什么这不起作用吗?
int max_index(int arr[], int start, int end)
{
if ( start >= end ) {
return 0;
}
else if ( end - start == 1 ) {
return start;
}
else {
int greatest = max_index(arr, start + 1, end);
if( arr[start] > arr[greatest])
{
return start;
}
else
{
return greatest;
}
}
}
void swap(int arr[], int i, int j) {
int temp;
temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void rec_ssort(int arr[], int len) {
int start = 0;
int last = len - 1;
//int n = len;
int maxindex = max_index(arr, start, last);
//if(arr[maxindex]>0 || arr[maxindex]<n)
{
if(arr[maxindex]>arr[last])
{
swap(arr, maxindex, last);
return rec_ssort(arr, last);
}
if(arr[maxindex] == arr[last])
{
return rec_ssort(arr, last);
}
}
}
int main(void)
{
int i = 0;
int arr[7] = {2,3,4,1,5,6,7};
int start = 0;
int end = 7;
int stuff = 5;
rec_ssort(arr, end);
for(i = 0; i<7; i++)
printf("%d\n", arr[i]);
}
答案 0 :(得分:2)
所有递归方法都需要一个基本情况(退出递归)。此外,如果您可以看到每个步骤发生的递归进度,它会有所帮助。请注意,当maxindex指向小于last的值时,您没有递归。
这是纠正rec_ssort
中的问题的一种方法:
void rec_ssort(int arr[], int len) {
// base case: if we're looking at an empty array we're done.
if (len <= 0) return;
int last = len - 1;
int maxindex = max_index(arr, 0, last);
if (arr[maxindex] > arr[last]) {
swap(arr, maxindex, last);
}
// recursively call with a shorter len
rec_ssort(arr, last);
}