【问题标题】:What I am doing wrong with this function, it does not end我在这个功能上做错了什么,它并没有结束
【发布时间】:2018-12-07 07:11:49
【问题描述】:

这是我几个月前看到的一个函数,我试图复制它,但我认为我遗漏了一些东西,因为程序没有结束。

void quick_sort(int *array, int len) {
     for (int i = 0; i < len - 1; i++) {
         if (array[i] > array[i + 1]) {
             int temp = array[i];
             array[i] = array[i + 1];
             array[i + 1] = temp;
          }
      }
      quick_sort(array, len);
 }

我在这里做错了什么?有人可以帮忙吗?

【问题讨论】:

  • 递归结束的条件是什么?
  • 你总是在递归调用quick_sort(array, len);。它应该在某个if 块中或被return 跳过,否则会出现无限递归。
  • 每个递归函数必须包含 (1) 退出条件(上面的 base_case)和 (2) 递归调用。您的函数没有退出条件并不断调用quick_sort (array, len),其中len 永远不会更改,并且对array 所做的任何操作都不会触发递归退出。

标签: c sorting qsort


【解决方案1】:

首先,这个函数没有正确命名:这绝对是 没有 像快速排序。它看起来像冒泡排序算法的内部循环,死的赠品是相邻元素的升序比较和潜在交换

也就是说,要使 this 排序例程递归,只需将传统冒泡排序的外循环推入递归激活堆栈即可。要理解这一点,请考虑一个基本的非交换检测优化冒泡排序:

void bubblesort(int arr[], size_t len)
{
    while (len-- > 0) // THIS LOOP
    {
        for (size_t i=0; i<len; ++i)
        {
            if (arr[i] > arr[i+1])
            {
                int tmp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = tmp;
            }
        }
    }
}

你可以在上面看到外部循环是我们想要存储在堆栈中的东西。那么我们该怎么做呢?好吧,首先我们需要停止递归的条件和内部循环。然后,我们可以用比当前长度小一个元素的长度进行递归:

void bubblesort(int arr[], size_t len)
{
    if (len-- < 2) // base case to exit on trivial sequence
        return;

    for (size_t i=0; i<len; ++i)
    {
        if (arr[i] > arr[i+1])
        {
            int tmp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = tmp;
        }
    }

    // recurse with one fewer element.
    bubblesort(arr, len);
}

就是这样。这也是尾递归应用程序的教科书示例,因此我们可以使用迭代循环来实现(显然,这就是我们一开始就使用的)。

因此,总而言之,您错过了出口案例以及最终到达该出口案例的长度减少。解决这两个问题,该函数应该“工作”(术语使用松散,因为没有人会使用这样的函数对非平凡数据进行排序)。

【讨论】:

    【解决方案2】:

    您必须提供exit condition 否则它将永远运行。
    您的代码没有任何退出条件,因此它无限运行。
    您一直在调用quick_sort(array, len);,但想一个场景,您需要停止调用quick_sort(array, len);,并为其设置条件(这将是您的退出条件),这样您就可以停止无限循环运行它。

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 2013-10-21
      • 2011-05-08
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 2017-09-29
      相关资源
      最近更新 更多