【问题标题】:Why is my QuickSort overflowing?为什么我的快速排序溢出?
【发布时间】:2013-11-30 11:46:02
【问题描述】:

我正在尝试使用随机枢轴实现QuickSort()

当我不随机化枢轴并将其选择为 A[0] 时,一切正常, 但是当我实现随机化时,事情就变得疯狂了。

分区:

int Partition(int A[], int left, int right, int pivot = 0)
{
    swap(A[left], A[pivot]);

    int temp = right;

    while (pivot != temp)
    {
        // make a swap if needed
        if (A[pivot] > A[temp] && temp > pivot || A[temp] > A[pivot] && temp < pivot)
        {
            // swap both data and index
            swap(A[pivot], A[temp]);
            swap(pivot, temp);
        }

        // advance the temp towards pivot
        if (temp < pivot)
            temp++;
        else
            temp--;
    }
return pivot;
}

快速排序:

void QuickSort(int A[], int left, int right)
{
    int pivot;

    if (left < right) {
        // randomize pivot
        srand(time(NULL));
        pivot = rand() % (right - left + 1);

        // partition and call quicksort
        pivot = Partition(A, left, right, pivot);
        QuickSort(A, left, pivot - 1);
        QuickSort(A, pivot + 1, right);
    }
}

【问题讨论】:

  • 首先,不要在QuickSort 中调用srand,因为它会在给定的一秒内被调用很多次,您将获得所有 相同的种子调用,导致rand 一直返回相同的值。只调用一次 int,在 main 的开头。
  • 就是@JoachimPileborg,它解决了溢出问题。但由于某种原因,排序不正确。
  • 如果它排序正确 vs A[0],但不是 vs rand pivot 元素,一个快速的补丁是在初始元素和随机元素之间进行交换。然后像以前一样调用分区,使用枢轴与新的零元素。
  • 从一个小数组开始,在调试器中逐行执行代码。然后当你把它展示给教授时扔掉它并开始使用std::sort
  • 正确意味着包含还是超出数组末尾?

标签: c++ quicksort partitioning


【解决方案1】:

这是一个问题:

pivot = rand() % (right - left + 1);

需要

pivot = left + rand() % (right - left + 1);

【讨论】:

  • 你是对的,因为我将整个数组发送到递归,我需要让枢轴选择我当前左边和数组末尾之间的一个数字。
猜你喜欢
  • 1970-01-01
  • 2018-04-13
  • 2011-06-02
  • 1970-01-01
  • 2021-06-19
  • 2015-03-19
  • 2015-06-25
  • 2018-03-28
  • 2015-06-06
相关资源
最近更新 更多