【发布时间】:2014-01-28 18:13:56
【问题描述】:
我有
std::vector<unsigned int> numbers;
那是用数字填充的,需要在不使用 int 索引的情况下快速排序 - 只允许 unsigned int 作为向量索引。
当我将所有“int”转换为“unsigned int”时,我看到的所有快速排序示例都会中断 因为在某些情况下索引可能为 -1(由于 j--)。
编辑:这是一个例子
void quickSort(std::vector<unsigned int> &numbers, unsigned int left, unsigned int right) {
unsigned int i = left, j = right;
unsigned int tmp;
unsigned int pivot = numbers.size()/2;
/* partition */
while (i <= j) {
while (numbers[i] < pivot)
i++;
while (numbers[j] > pivot)
j--;
if (i <= j) {
tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
quickSort(numbers, left, j);
if (i < right)
quickSort(numbers, i, right);
}
修改版:http://diogopinho.hubpages.com/hub/easy-quicksort-with-examples
Segfaults 上面的示例,因为如果 j 是 unsigned int 并变为 0,则 j-- 变为一个巨大的数字 (0xffffffff) 并且 (i
【问题讨论】:
-
如果您看到错误的来源,您应该能够自己解决问题。不看代码就很难猜到。
-
我会这样做: 1. 给自己一个 C++ 标准库实现,其中
std::sort被实现为快速排序; 2.std::sort(numbers.begin(), numbers.end()); -
什么是0-1的情况?显示您无法解决如何替换的特定代码。我没有立即明白为什么 QuickSort 实现会在任何地方使用负数。
-
quicksort()需要有符号值的理由为零。如果你没有找到任何东西,那么你 (a) 看起来不够努力,并且 (b) 自己从未尝试过。因此,请展示 你 是如何做到的,以及如何无法使用unsigneds。只。此外,给定std::vector<>并且不允许使用std::sort<>我会首先使用迭代器来实现它。 -
如果您的参考代码通过减去它们来比较
int,那么它做错了,因为有符号算术的行为在溢出时是未定义的。
标签: c++ algorithm sorting quicksort