C中的Quicksort实现,不使用多个数组

时间:2015-04-27 23:43:47

标签: c arrays algorithm sorting quicksort

我试图弄清楚如何在不创建额外数组的情况下实现快速排序。然而,这种实现仅在我使用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);
}

2 个答案:

答案 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,那么总是最终会导致溢出(无论初始数组的大小如何)。

需要在里面选择递归函数。