为什么我的逻辑对我的选择排序递归程序不正确?

时间:2014-10-21 02:42:29

标签: c

所以我的递归选择排序调用两个函数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]);
}

1 个答案:

答案 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);
}