如何为QuickSort设置Comparator

时间:2018-03-24 00:44:27

标签: c++ comparator

我在使用C ++中的比较器时遇到了问题。现在,我只是尝试使用通用参数在Goodrich的书“数据 C ++中的结构和算法”中实现快速排序。以下是本书的代码:

#include <iostream>
#include <vector>
#include <functional>

template <typename E, typename C> // quick-sort S void quickSort(std::vector<E>& S, const C& less) {
void quickSort(std::vector<E>& S, const C& less){
        if (S.size() <= 1)
            {return;}// already sorted
        quickSortStep(S, 0, S.size()-1, less); // call sort utility
}


template <typename E, typename C>
void quickSortStep(std::vector<E>& S, int a, int b, const C& less) {
    if (a >= b) {return;}
    E pivot = S[b];
    int l=a;
    int r=b-1;
    while (l <= r) {
        while (l <= r && !less(pivot, S[l]))
            {l++;}//pivot is greater than S[l]
        while (r >= l && !less(S[r], pivot))
            {r--;}
        if (l < r)
            {std::swap(S[l], S[r]); std::swap(S[l], S[b]);}
        quickSortStep(S, a, l-1, less);
        quickSortStep(S, l+1, b, less);
    }
}

我找到了一个模板的代码,可以比较整数和双精度,并试图让它适用于这个程序。但是,当我将函数isLess作为参数传递并尝试运行程序时,我得到了一个构建错误:Call to function 'quickSortStep' that is neither visible in the template definition nor found by argument-dependent lookup。我已经粘贴了下面的isLess函数以及我的main的代码,并且非常感谢有关如何实现比较器的任何建议。

template <typename T>
bool isLess(T a, T b)
{
    return a<b;
}


int main(int argc, const char * argv[]) {
    //vector and comparator
    int myInts[]={15,2,7,99};
    std::vector<int>myVec(myInts,myInts+sizeof(myInts)/sizeof(int));
    int a,b;
    quickSort(myVec,isLess<int>(a, b));
    return 0;
}

EDIT ::

这本书的代码没有正确排序,所以我对quickSortStep()进行了以下调整,现在工作正常:

void quickSortStep(std::vector<E>& S, int a, int b, const C& less) {
    if (a >= b) {return;}
    E pivot = S[b];
    int l=a;
    int r=b-1;
    while (l <= r) {
        while (l <= r && !less(pivot, S[l]))
            {l++;}//pivot is greater than S[l]
        while (r >= l && !less(S[r], pivot))
            {r--;}
        if (l < r)
            {
                std::swap(S[l], S[r]);

            }
    }
    std::swap(S[l], S[b]);
    quickSortStep(S, a, l-1, less);
    quickSortStep(S, l+1, b, less);
}

1 个答案:

答案 0 :(得分:0)

以下代码回答了您的问题。但快速排序不起作用。也许你错误地转录了它。

template <typename T>
bool isLess(T a, T b)
{
    return a<b;
}


int main(int argc, const char * argv[]) {
    //vector and comparator
    std::vector<int> myVec { 15,2,7,99 };
    quickSort(myVec,isLess<int>);
    auto OK = std::is_sorted(myVec.begin(), myVec.end());
    assert(OK);
    return 0;
}