qsort 不适用于我的 impl 中的浮点类型。怎么了?

qsort doesn't work for float types in my impl. what is wrong?

我不知道为什么代码不适用于浮点类型,我的意思是 qsort 算法。我尝试了不同的方法来排序它,但没有成功。在 int 类型的情况下,代码工作正常但不适用于 floating 类型,这让我感到困惑。有人知道是什么问题吗?

感谢 tpps。

header:

template <class T>
class arraysort
{
    public:

    arraysort(int);
    ~arraysort();
    //int compare (const void *a,const void *b);
    T& operator[] (int index);
    void quicksort(T a, T b);
    void printout(); 

    private:
    T *ptr;
    int size;
    const void *a;
    const void *b;
    static T compare (const void * a, const void * b);
};

c++

#include "arraysort.h"
#include <stdlib.h>

template <typename T>
arraysort<T>::arraysort(int s)
{
    size = s;
    ptr = new T[size];
}

template <typename T>
arraysort<T>::~arraysort()
{
    delete [] ptr;
}

template <typename T>
T& arraysort<T>::operator[](int index)
{
    return ptr[index];
}

template <typename T>
T arraysort<T>:: compare (const void * a, const void * b)
{
    T fa = * (const T * ) a;
    T fb = * (const T * ) b;
    return (fb - fa);
}

template <typename T>
void arraysort<T>::quicksort (T a, T b)
{
  qsort(ptr, size, sizeof(T), (int( * )(const void * ,const void * )) compare);
}

template <typename T>
void arraysort<T>::printout()
{
    for(int i = 0; i < size; i++)
        std::cout<< ptr[i] <<" ";
    std::cout<<std::endl;
}

qsort 调用的比较函数预期为 return 和 int,但是当您的模板使用 float 函数时 return a float。这会调用 undefined behavior.

compare 函数更改为始终 return 和 int 并执行显式比较以确定哪个更大。

template <typename T>
int arraysort<T>:: compare (const void * a, const void * b)
{
    T fa = * (const T * ) a;
    T fb = * (const T * ) b;

    if (fa > fb) {
        return -1;
    } else if  (fa < fb) {
        return 1;
    } else {
        return 0;
    }
}

请注意,这不处理 NaN 值。您需要弄清楚如何分别处理它们。