【问题标题】:Why is my logic incorrect for my selection sort recursion program?为什么我的选择排序递归程序的逻辑不正确?
【发布时间】:2014-10-21 11:00:45
【问题描述】:

所以我的递归选择排序调用两个函数 max_index 和 swap,同时它应该递归地交换这些东西,但由于某种原因,它似乎对某些数组(比如我在 main 中设置的数组)破裂并爆炸.有谁知道为什么会这样?有人可以解释并告诉我为什么这不起作用吗?

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]);
}

【问题讨论】:

  • 我建议您从一个小的输入集开始,然后在调试器中逐行执行代码,看看会发生什么。
  • 另外,对于数组的长度,你传递最后一个索引而不是长度。
  • 你的意思是什么调试器?我现在在 linux 上,对调试器一无所知。
  • 那我建议你先把算法写在纸上,然后再在纸上一步步完成。你可能应该开始的东西。请记住检查较大、相等的 较小的值。提示:在纸上做的时候不必使用C语句和关键字和函数调用,简单的单词就足够了。另一种调试技术是插入中间打印输出,记录程序现在正在做什么。

标签: c


【解决方案1】:

所有递归方法都需要一个基本情况(退出递归)。此外,如果您可以看到每一步发生的递归进度,这将有所帮助。请注意,当 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);
}

【讨论】:

  • 嗯,让我试试这个。感谢您的回复!
  • 你似乎把我写的代码量减少了 50% 以上。这让我很沮丧,因为我不认为它可以那样做......我'我还在努力理解你在这里做了什么。
  • 递归总是在减小数组的大小。在每一步中,您都将最大的元素交换到数组的末尾。删除last 变量也是有效的,调用max_index(arr, 0, len),然后调用rec_ssort(arr, len - 1),并删除您的if 比较,以便更轻松地查看发生了什么。伪代码:找到最大的元素,放在数组的末尾,减去新找到的最大元素,对数组进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多