C#中浮点数有好的基数排序实现吗?我有一个包含float类型字段的数据结构。这些结构的集合需要按其浮点值排序。是否有基数排序实现。如果没有,是否有快速访问指数、符号和尾数的方法。因为如果你在尾数、指数和指数上最后排序浮点数。您在O(n)中对浮点数进行排序。更新:我对这个主题非常感兴趣,所以我坐下来实现它(使用这个非常快速且内存保守的实现)。我还阅读了这篇文章(感谢celion),发现您甚至不必将浮点数拆分为尾数和指数来对其进行排序。你只需要一个一个地做位并做一个int排序。您只需要关心负值,在算法结束时它们必须在正值之前反转(我在算法的最后一次迭代中一步完成,以节省一些cpu时间)。所以继承我的浮点数基数:publicstaticfloat[]RadixSort(thisfloat[]array){//临时数组和将浮点数转换为整数的数组int[]t=newint[array.Length];int[]a=newint[array.Length];for(inti=0;i>shift)&掩码]++;//在第一轮额外计算所有负数//值if(c==0&&a[i]>shift)&mask]++;if(c==groups-1){//我们在最后(最重要的)组中,如果//数字为负数,则将它们倒序排列在数组的//前面,将正数推回。if(a[i]它比int基数排序稍慢,因为数组在函数的开头和结尾被复制,其中浮点数按位复制到整数并返回。但是,整个函数也是O(n)。无论如何比您建议的顺序排序快3倍。我看不到太多优化空间了,但如果有人这样做:请随时告诉我。要降序排序,请在末尾更改此行:ret[i]=BitConverter.ToSingle(BitConverter.GetBytes(a[i]),0);为此:ret[a.Length-i-1]=BitConverter.ToSingle(BitConverter.GetBytes(a[i]),0);测量:我针对浮点数(NaN、+/-Inf、最小/最大值、0)和随机数的所有特殊情况设置了一些简短测试。它的排序顺序与Linq或Array.Sort排序完全相同:NaN->-Inf->Min->NegativeNums->0->PositiveNums->Max->+Inf所以我做了很多10M数字测试:float[]test=newfloat[10000000];随机rnd=newRandom();for(inti=0;iandstop不同排序算法的计时:Stopwatchsw=newStopwatch();sw.Start();float[]sorted1=test.RadixSort();sw.Stop();Console.WriteLine(string.Format("RadixSort:{0}",sw.Elapsed));sw.Reset();sw.Start();float[]sorted2=test.OrderBy(x=>x).ToArray();sw.Stop();Console.WriteLine(string.Format("LinqOrderBy:{0}",sw.Elapsed));sw.Reset();sw.Start();Array.Sort(test);float[]sorted3=test;sw.Stop();Console.WriteLine(string.Format("Array.Sort:{0}",sw.Elapsed));输出是(更新:现在运行发布版本,不调试):RadixSort:00:00:03.9902332LinqOrderBy:00:00:17.4983272Array.Sort:00:00:03.1536785关于Linq四倍多。这还不错。仍然不如Array.Sort快,但也没有那么糟糕。但我对此感到非常惊讶:我预计它在非常小的数组上会比Linq慢一点。但后来我用20个元素进行了测试:RadixSort:00:00:00.0012944LinqOrderBy:00:00:00.0072271Array.Sort:00:00:00.0002979即使这次我的Radixsort比Linq快,但比数组慢。?更新2:我做了一些测量并发现了一些有趣的东西:更长的组长度常数意味着更少的迭代和更多的内存使用。如果您使用16位的组长度(仅2次迭代),则在对小数组进行排序时会产生巨大的内存开销,但如果涉及大于大约100k元素的数组,您可以击败Array.Sort,如果不是很多的话.图表轴都是对数的:比较图表http://sofzh.miximages.com/c%23/radixsort_vs_arraysort.png我认为最好的选择是如果值不是太靠近并且你有合理的精度要求,你可以使用小数点前后的实际浮点数来排序。例如,可以使用小数点前4位(是否为0)进行排序。关于如何对浮点数进行基数排序有一个很好的解释:http://www.codercorner.com/RadixSortRevisited.htm如果你所有的值都是正数,你可以使用二进制表示;该链接解释了如何计算负值。您可以使用unsafe块来memcpy或将float*别名为uint*来提取位。以上是C#学习教程:C#中浮点数有好的基数排序实现吗?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
