【发布时间】: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