自定义C++快速排序问题



我正在用C++自己实现Quicksort算法。但我有问题:结果没有排序!

以下是我的文件:主文件:quicksort.cpp:

#include <iostream>
#include <ctime>
#include "quicksort.h"
#include "utils.h"
using namespace std;
int main() {
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

print_array(arr);
cout << endl;
QuickSort<int, 10>::sort(arr);
print_array(arr);
cout << endl;
return 0;
}

utils.h:

#ifndef UTILS_H
#define UTILS_H
#include <iostream>
#include <openssl/rand.h>
#include <algorithm>
using namespace std;
template<typename T, size_t N>
void print_array(T (&a)[N]) {
cout << "{";
for(auto i: a) { cout << i << ","; }
cout << "}";
}
template<typename T, size_t N>
void shuffle_array(T (&a)[N]) {
srand(unsigned(time(0)));
random_shuffle(&a[0], &a[10], [](int i)-> int {
unsigned char bytes[i];
RAND_bytes(bytes, sizeof(bytes));
return int(bytes[0] % i);
});
}
#endif /* UTILS_H */

quicksort.h:

#ifndef QUICKSORT_H
#define QUICKSORT_H
#include <iostream>
#include "utils.h"
template<typename T, size_t N>
class QuickSort {
private:
static bool less(T a, T b) {
return a < b;
}
private:
static void exch(T (&a)[N], int i, int j) {
T tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
private:
static int partition(T (&a)[N], int lo, int hi) {
int i = lo;
int j = hi + 1;

while(true) {
while(less(a[++i], a[lo])) {
if(i == hi) { break; }
}
while(less(a[lo], a[--j])) {
if(j == lo) { break; }
}
if(i >= j) { break; }
exch(a, i, j);
}
exch(a, lo, hi);
return j;
}
public:
static void sort(T (&a)[N]) {
shuffle_array(a);
print_array(a);
cout << endl;
sort(a, 0, int(N - 1));
}
private:
static void sort(T (&a)[N], int lo, int hi) {
if(hi <= lo) { return; }
int j = partition(a, lo, hi);
sort(a, lo, j - 1);
sort(a, j + 1, hi);
}
};
#endif /* QUICKSORT_H */

我是不是错过了什么?我在Linux上用编译这个

$ g++ -pipe -time -o quicksort.exe quicksort.cpp -lssl -lcrypto

请帮忙,我是C++新手。

首先,行exch(a, lo, hi);应该是exch(a, lo, j);。它似乎解决了您的问题:https://godbolt.org/z/ehh31G

第二,如果你正在学习c++,请使用c++功能。也就是说,使用标准库。用std::array<T, N>代替T[N]。对lohiij使用迭代器而不是int。CCD_ 13可以用CCD_。CCD_ 15可以用CCD_。

第三-不要在标题文件中使用using namespace std!最好不要使用它。

最后,学习使用调试器作为所提到的注释。

祝你好运。

最新更新