这是我几个月前看到的一个函数,我试图复制它,但是我认为我遗漏了一些东西,因为程序没有结束。
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);
}
我在这里做错了什么?有人可以帮忙吗?
答案 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);
,并为此设置条件(这将是退出条件),这样您就可以停止运行它无限循环。