【问题标题】:Issue with custom C++ QuickSort自定义 C++ 快速排序问题
【发布时间】: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


【解决方案1】:

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

第二 - 如果您正在学习 c++,请使用 c++ 功能。也就是说,使用标准库。 使用std::array&lt;T, N&gt; 代替T[N]。对于lohiij,使用迭代器而不是ints。 exch 可以替换为 std::swapless 可以替换为std::less

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

最后,学习使用你的调试器作为评论提到。

祝你好运。

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 2018-01-31
    • 2017-01-14
    • 2019-07-05
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多