我试图弄清楚如何在不创建额外数组的情况下实现快速排序。然而,这种实现仅在我使用1作为枢轴时才有效。当我使用任何其他号码时,程序seg会出错。我无法弄清楚哪个变量超出界限会导致无限循环。我非常感谢对此功能的任何批评/帮助。
void quick_sort(Item a[], int max, int pivot)
{
int i, j, p, t;
printf("%d", pivot);
if (max < 2)
{
return;
}
p = a[pivot];
printf("%d", p);
for (i = 0, j = max-1;; i++, j--)
{
while (a[i] < p)
{
i++;
}
while (p < a[j])
{
j--;
}
if (i >= j)
{
break;
}
t = a[i];
a[i] = a[j];
a[j] = t;
}
quick_sort(a, i, pivot);
quick_sort(a+i, max-i, pivot);
}
答案 0 :(得分:0)
你的程序是segfaulting,因为如果你选择一个硬的数据透视表,例如2,如果在一个只有2个项目的分区中调用quick_sort
,那么a[2]
将是超出范围。
我认为您的解决方案的最佳选择是在函数内部选择枢轴,可以随机选择,也可以只获取任意值,例如max/2
。您只需要确保0 <= pivot < max
:
void quick_sort(int a[], int max)
{
int pivot = max/2;
int i, j, p, t;
if (max < 2)
{
return;
}
p = a[pivot];
for (i = 0, j = max-1;; i++, j--)
{
while (a[i] < p)
{
i++;
}
while (p < a[j])
{
j--;
}
if (i >= j)
{
break;
}
t = a[i];
a[i] = a[j];
a[j] = t;
}
quick_sort(a, i);
quick_sort(a+i, max-i);
}
答案 1 :(得分:0)
问题在于以下两行:
quick_sort(a, i, pivot);
quick_sort(a+i, max-i, pivot);
Quicksort通过递归排序数组的较小和较小部分来工作。最终,你到达了数组中只有一个元素的地步,这就是递归基本情况。
问题是当数组缩小时,pivot
值会在所有调用中传递下来。如果pivot不是1,那么总是最终会导致溢出(无论初始数组的大小如何)。
需要在里面选择递归函数。