我在用此功能做错什么,它并没有结束

时间:2018-12-07 07:11:49

标签: c sorting qsort

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

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

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

2 个答案:

答案 0 :(得分: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);
}

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

因此,总的来说,您缺少出口案例,并且最终减少了出口案例的长度。针对这两种情况,该函数应“起作用”(术语用得其零,因为没有人会使用这样的函数对非平凡的数据进行排序)。

答案 1 :(得分:0)

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