c++随机快速排序Bug
C++ Randomized Quick Sort Bug
我试图实现快速排序算法,但不知何故我有一个bug,我只是找不到它,我的randomizedPartition似乎工作得很好。代码如下:
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int randomizedPartition(int *v, int start, int end);
void quickSort(int *v, int start, int end);
void swap(int *p, int *q);
void print(int *v, int len);
int main(int argc, char const *argv[]) {
cout << "QUICK SORT:n" << endl;
int v[] = {6, 4, 7, 3, 0, 1 , 2, 9, 19};
int len = sizeof(v)/sizeof(int);
cout << "Before Sorting: " << endl;
print(v, len);
cout << "After Sorting: " << endl;
quickSort(v, 0, len - 1);
print(v, len);
return 0;
}
int randomizedPartition(int *v, int start, int end) {
int len = (int) abs(end - start + 1);
srand (time(NULL));
int idx = rand() % len;
cout << "IDX RD: " << idx << endl;
int pivot = v[idx];
swap(&v[start], &v[idx]);
int i = start - 1;
int j = start;
for (int posi = start + 1; posi <= end; ++posi) {
if(v[posi] <= pivot) {
++i;
++j;
swap(&v[posi], &v[i]);
swap(&v[posi], &v[j]);
}
}
cout << "Pivot: " << pivot << endl;
cout << "Pivot Index: " << (i + 1) << endl;
return ++i;
}
void quickSort(int *v, int start, int end) {
if (start < end) {
int idx = randomizedPartition(v, start, end);
print(v, end - start + 1);
cout << "Start: " << start << endl;
cout << "End: " << end << endl;
cout << "idx - 1: " << idx - 1 << endl;
cout << "idx + 1: " << idx + 1 << endl;
quickSort(v, start, idx - 1);
quickSort(v, idx + 1, end);
}
}
void print(int *v, int len) {
for (int i = 0; i < len; ++i) {
cout << *(v + i) << " ";
}
cout << "n" << endl;
}
void swap(int *p, int *q) {
int temp = *p;
*p = *q;
*q = temp;
}
有谁能帮我找到这个bug吗?下面是一种可能的输出:
Before Sorting:
6 4 7 3 0 1 2 9 19
After Sorting:
IDX RD: 2
Pivot: 7
Pivot Index: 6
4 6 3 0 1 2 7 9 19
Start: 0
End: 8
idx - 1: 5
idx + 1: 7
IDX RD: 5
Pivot: 2
Pivot Index: 2
0 1 2 6 3 4
Start: 0
End: 5
idx - 1: 1
idx + 1: 3
IDX RD: 1
Pivot: 1
Pivot Index: 1
0 1
Start: 0
End: 1
idx - 1: 0
idx + 1: 2
IDX RD: 2
Pivot: 2
Pivot Index: 3
0 1 6
Start: 3
End: 5
idx - 1: 2
idx + 1: 4
IDX RD: 1
Pivot: 1
Pivot Index: 4
0 3
Start: 4
End: 5
idx - 1: 3
idx + 1: 5
IDX RD: 1
Pivot: 3
Pivot Index: 7
0 9
Start: 7
End: 8
idx - 1: 6
idx + 1: 8
0 9 6 2 1 4 7 3 19
您在randomizedPartition
中的索引应该是start + rand() % len
,而不仅仅是rand() % len
。
另外,作为旁注,您的print
函数实际上并没有做您想要它做的事情。您希望它打印元素start
到end
,但实际上它打印的是0
到end - start
。一般来说,您的调试过程和编码过程都将受益于尽量保持代码的简洁。代码现在有点乱,这使得它更难调试。
相关文章:
- 如何修复我的快速排序实现?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在 MIPS 中快速排序
- 不正确的比较和交换计数器输出用于快速排序功能
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- 使用快速排序对 C++ 中的可视化工具错误进行排序
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 并行快速排序分区中的隔离错误
- 实现 3 路分区以实现快速排序
- 为什么这个快速排序实现给出了一个奇怪的输出
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- 快速排序不适用于大型数组
- 快速排序;分段错误,但找不到位置?
- 快速排序函数在快速排序算法中如何工作?
- 3路随机快速排序分区功能
- 在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
- 当给出预先排序的输入时,为什么我的快速排序实现很慢
- 我想要一个改变数组快速排序的2个数字的函数
- 排序算法,(快速排序)小bug
- c++随机快速排序Bug