通常情况下,整数排序比浮点数排序快。这是因为整数排序只需要比较整数的大小,而浮点数排序需要比较浮点数的大小并考虑其精度。由于浮点数具有更多的可能取值,因此在排序时需要更多的比较操作,从而导致排序速度较慢。
以下是将浮点数转换成整数的方法:
/// Templates that contains signed and unsigned integer types of the given number of bits.
template <size_t Bits>
struct SizedIntegerType {
static_assert(Bits <= 8);
using Signed = int8_t;
using Unsigned = uint8_t;
};
template <>
struct SizedIntegerType<64> {
using Signed = int64_t;
using Unsigned = uint64_t;
};
template <>
struct SizedIntegerType<32> {
using Signed = int32_t;
using Unsigned = uint32_t;
};
template <>
struct SizedIntegerType<16> {
using Signed = int16_t;
using Unsigned = uint16_t;
};
/// Creates a radix sort key from a floating point value.
template <typename T, std::enable_if_t<std::is_floating_point<T>::value, int> = 0>
static typename SizedIntegerType<sizeof(T) * CHAR_BIT>::Unsigned make_key(T x) {
using U = typename SizedIntegerType<sizeof(T) * CHAR_BIT>::Unsigned;
using I = typename SizedIntegerType<sizeof(T) * CHAR_BIT>::Signed;
auto mask = U(1) << (sizeof(T) * CHAR_BIT - 1);
auto y = as<U>(x);
return (y & mask ? static_cast<U>(-static_cast<I>(y)) ^ mask : y) ^ mask;
}
make_key函数的基本原理:
以float类型举例,mask为符号位的掩码10000000 00000000 00000000 00000000 ,如果浮点数是负数,则符号位取反变为0,保留尾数,与mask两次异或运算之后符号位和尾数都不变,1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx → 0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx ;
如果是正数,与mask一次异之后,符号位变为1,尾数不变,0xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx → 1xxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
转换之后,正浮点数转换值依然大于负浮点数转换值