选择不同的枢轴

Choosing Different Pivot

本文关键字:选择      更新时间:2023-10-16

当我选择列表的第一个元素 pivot 时,这段代码有效,但例如我想让最后一个元素透视,我想在这个代码中进行最小的更改,所以我在 pivot=arr[low] 之前添加了 swap(arr[high],arr[low]( 我只是将低的值更改为高。但是程序停止运行。我不知道为什么这不起作用。

int partition(int low, int high, int arr[])
{
    int pivot = arr[low];
    int i = low;
    for (int j = low + 1; j <= high; ++j)
    {
        if (arr[j] < pivot)
        {
            ++i;
            swap(arr[j], arr[i]);
        }
    }
    swap(arr[low], arr[i]);
    return i;
}
void quickSort(int low, int high, int arr[])
{
    if (low < high)
    {
        int pivot = partition(low, high, arr);
        quickSort(low, pivot, arr);
        quickSort(pivot + 1, high, arr);
    }
}

我只是将低的值更改为高

如果您的意思是进行了此更改:

    int pivot = arr[high];     // was arr[low]

然后需要在其他地方更新代码。典型的洛穆托分区方案示例:

int Partition(int arr[], int low, int high)
{
    int pivot = arr[high];
    int i = low;
    for (int j = low; j < high; ++j)
    {
        if (arr[j] < pivot)
        {
            std::swap(arr[j], arr[i]);
            ++i;
        }
    }
    std::swap(arr[i], arr[high]);
    return i;
}
void QuickSort(int arr[], int low, int high)
{
    if (low < high)
    {
        int pivot = Partition(arr, low, high);
        QuickSort(arr, low, pivot-1);
        QuickSort(arr, pivot + 1, high);
    }
}