基数如何对浮点数据进行排序?例如 12.4、45.13 等。它会先读取小数点右侧吗?还是先读取小数点左侧?然后如果读取小数点右侧,它将如何处理数字,会它首先读取最右边的第一个?
3 回答
请参阅此页面的讨论。
http://codercorner.com/RadixSortRevisited.htm
基本上,计算机以特定格式存储浮点数。他们没有写成 45.13。结果,以这种方式思考它与它的实际工作方式无关。
忽略这一点,基数排序必须首先查看最重要的部分。在一个浮点数中,它最左边的数字。本质上,我们会将所有数字填充为小数点前的位数相同。然后我们从左到右读取数字。
基数排序对数字的二进制表示进行操作,并将对象排序为就好像它们是一个大二进制整数一样。
对于真正的整数和字符串,二进制表示与我们倾向于期望的整理顺序非常吻合,因此基数排序是一个有趣的替代方案,虽然有点不寻常。
事实证明,只要以正确的方向遍历浮点数,基数排序就可以很好地工作,只是它会将符号位向后处理。
在内部二进制表示中,FP 值有一个符号位,大约 10 位指数,然后大约 20 或 50 位是“分数”或尾数。
S E E E E E E E E M M M M M M M M M M M M M M M . . .
指数是有偏差的,因此小值实际上是最负的指数,因此它排序正确,尾数也是如此。
只要所有数字都是正数或负数,或者如果首先反转符号位,并且从左到右扫描,那么我认为基数排序将适用于 FP 数。
我知道的基数排序双打的最佳代码在这里:https ://bitbucket.org/ais/usort/src/474cc2a19224/usort/f8_sort.c