我正在Visual Studio中测试一些快速排序的案例,但是 我错了,我不确定我的代码有什么问题。
这是我的代码。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void Swap(int *arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
void BubbleSort(int *arr, int len) {
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
Swap(arr, j, j + 1);
}
}
}
}
void QuickSort(int *arr, int left, int right) {
if (left >= right) {
return;
}
int pivot = arr[left];
int low = left;
int high = right + 1;
while (low <= high) {
while (arr[++low] <= pivot && low <= right);
while (arr[--high] >= pivot && high > left);
if (low > high) {
Swap(arr, left, high);
}
else {
Swap(arr, low, high);
}
}
QuickSort(arr, left, high - 1);
QuickSort(arr, high + 1, right);
}
int main() {
srand((unsigned)time(NULL));
int *arr = new int[10000];
for (int i = 0; i < 10000; i++) {
arr[i] = rand() % 10000;
}
BubbleSort(arr, 10000);
QuickSort(arr, 0, 9999);
delete[] arr;
return 0;
}
分配多少内存都没关系 但是此代码的情况与我的QuickSort()函数有关。
答案 0 :(得分:3)
当pivot
是最大元素时,第一个内部while
循环将运行,直到++low
>> right
,从而导致对数组的访问超出范围。您必须先检查low < right
,然后才能访问arr[++low]
。同样的事情适用于第二循环。
另外,使用std::swap
而不是自己动手,为数组索引使用std::size_t
,并使用C ++ <random>
库而不是C rand()
函数。还有don't do using namespace std
。