【发布时间】:2020-12-13 20:23:07
【问题描述】:
我自己在 C++ 中实现快速排序算法。但是我有问题:结果没有排序!
这是我的文件:
主文件: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++ 新手。
【问题讨论】:
-
试过调试jet?洞察力在哪里?
-
exch(a, lo, hi);似乎可疑? -
@AlanBirtles 不,这一行交换了第一个和最后一个元素。
-
我可以看到它做了什么看起来很奇怪的是无条件地交换分区末尾的第一个和最后一个元素,你为什么这样做?
标签: c++ algorithm sorting g++ quicksort