我开始在C++
中学习算法并坚持使用Quicksort
。但是我无法在我的代码中得到没有正确排序数组的错误。
以下是code的链接或以下是代码:
#include <iostream>
using namespace std;
void printArray(int array[], int len) {
for (int i = 0; i < len; i++) {
cout << array[i] << " ";
}
cout << endl;
}
void swap(int* a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int arr[], int lo, int hi) {
int pivot = arr[hi];
int i = lo - 1;
for (int j = lo; j < hi-1; j++) {
if (arr[j] <= pivot) {
i +=1;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i+1], &arr[hi]);
return i+1;
}
void quicksort(int arr[], int lo, int hi) {
if (lo < hi) {
int p = partition(arr, lo, hi);
quicksort(arr, lo, p-1 );
printArray(arr, 8);
quicksort(arr, p + 1, hi);
}
}
int main() {
int len;
int array[] = {2,8,7,1,3,5,6,4};
len = (sizeof(array)/sizeof(array[0]));
quicksort(array, 0, len-1);
printArray(array, len);
return 0;
}
我正在打印数组元素,以便我可以看到数组元素的行为。
答案 0 :(得分:2)
您的实现看起来非常接近Wikipedia上的伪代码(代码中的j
中的partition(..)
在维基百科文章中被称为i
i
在您的代码中,名称为storeIndex
)
但是有两个不同之处,其中一个至少导致算法在你的例子中失败:
for (int j = lo; j < hi-1; j++)
应该是
for (int j = lo; j <= hi-1; j++)
维基百科文章说for i from lo to hi−1, inclusive
因此<=
代替<
。
另一个区别是你的代码中有
if (arr[j] <= pivot)
而维基百科的文章有
if A[i] < pivotValue
所以<
代替<=
。
答案 1 :(得分:1)
请更改for
循环:
for (int j = lo; j < hi-1; j++)
到
for (int j = lo; j < hi; j++)
或
for (int j = lo; j <= hi-1; j++)
必须从lo
到hi
(包含)处理数组的原因。
但是,在你的尝试中它只采取
{lo,low + 1,...,hi-1}
而不是
{lo,low + 1,...,hi-1, hi }