【发布时间】:2014-06-23 09:50:55
【问题描述】:
试图写一个快速排序并花了一段时间调试。问题似乎出在第二次递归调用中,但我不知道我在哪里。任何指针都会很棒。谢谢。
void quickSort(vector<int> &list, int left, int right){
int pivot = left;
int temp = right;
if(left >= right - 1)
return;
while (left != right) {
if (pivot == left){
if (list[pivot] > list[right]) {
//-------------------------
int tempList = list[right];
list[right] = list[pivot]; // Swap for now
list[pivot] = tempList;
//-------------------------
pivot = right;
left++;
}else{
right--;
}
}else{
if (list[pivot] < list[left]) {
//-------------------------
int tempList = list[left];
list[left] = list[pivot]; // Swap for now
list[pivot] = tempList;
//-------------------------
pivot = left;
right--;
}else{
left++;
}
}
}
quickSort(list, 0, right-1);
quickSort(list, right + 1, temp);
}
这就是我现在制作数据集的方式:
srand(time(0));
vector<int> list;
vector<int> sortedList;
int i;
for (i=0;i<10;i++) list.push_back(rand() %100);
我得到了一个数据集 38 65 26 22 86 64 13 28 57 18
得到的输出为 13 18 22 26 28 38 57 64 86 65
通常是后半部分的一个元素,但也不是每次都这样。可能是四分之一。
【问题讨论】:
-
我更新了更多细节。该错误仅每隔几次发生一次。平均可能有四分之一。
-
不是针对随机数据进行测试,而是设置单元测试来测试越来越复杂的场景。您将有更好的方法来理解和重现任何故障。如果您有一个导致错误的随机数据集,请设置一个每次都使用该数据集的测试。
-
@Bargangilo - 由于已经存在
std::list模板类,我也会避免将您的参数命名为list
标签: c++ quicksort off-by-one