用于浮点运算的快速、基于秩的基数排序
A fast, rank based Radix Sort for floats?
我正在寻找一个快速稳定的基数排序实现(支持浮点),它返回排序顺序的索引,而不是排序值。
Pierre Terdiman的版本来自他的文章"Radix Sort Revisited",它正是我想要的,但它已经有13年多的历史了,不适合现代流水线CPU。
Michael Herf的"Radix Tricks"中的RadixSort11非常快,唯一的问题是它返回排序的值而不是索引,此外它还会破坏输入数组的值。
如有任何帮助,我们将不胜感激。
您可以选择
-
展开每个项目以包括其原始索引(这可以在第一次计数过程中完成)。当然,出于排序目的,会忽略索引数字。
-
将索引而不是值存储到存储桶中。每次需要数字时查找值。
第一个占用更多空间,但具有更好的参考位置,第二个节省空间。
使任何排序都基于索引是相当直接的。任何一种都是一系列的比较和交换,所以这样做吧。
// data to be sorted is in data[ 0 .. n ]
int index[ n + 1 ];
for( int i = 0; i <= n; i++ ) index[i] = i;
// To compare data, compare data[index[j]] < data[index[k]]
// To swap values, swap index[j] <=> index[k]
我不熟悉这些实现,但这里是我的一个实现中的内部函数,仅适用于整数:
//-------------------------------------------------------------------------------------
//! sort the source array based on b-th byte and store the result in destination array
//! and keep index (how to go from the sorted array to the un-sorted)
template<typename T, typename SS, typename SD> inline
void radix_sort_byte(size_t b, array<T, SS>& src, array<T, SD>& dest,
size_array& ind_src, size_array& ind_dest)
{
b *= 8;
size_t B = 256, N = src.size();
size_array bytes = (src >> b) & 0xff; // current byte of each element
size_array count(B, size_t(0)); // occurrences of each element
++count[bytes];
if(count[0] == N) // all bytes are zero; order remains unchanged
{ dest = src; ind_dest = ind_src; return; }
size_array index = shift(cumsum(count), 1); // index-list for each element
size_array pos(N); // position of each element in the destination array
for(size_t i=0; i<N; i++) pos[i] = index[bytes[i]]++;
dest[pos] = src; // place elements in the destination array
ind_dest[pos] = ind_src; // place indices
}
它不是直接可读的,因为它使用了许多辅助结构和函数,但其思想是保留一个带有索引的单独数组。一旦确定了元素在目标数组(pos)中的位置,最后两行将以完全相同的方式更新值数组和索引数组。
我想您可以将同样的想法应用于任何实现,但您必须修改代码。
相关文章:
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++基数排序的有效方法
- 基数排序函数不适用于基数 2?
- 基数排序需要使用常量值进行修复
- 基数排序256性能
- C++:使用 LSD 基数排序字符串排序崩溃
- 就地快速基数排序实现
- 最高有效位基数排序如何比最低有效位基数分类更有效
- 霍勒里斯的基数排序
- 如何优化间接基数排序?(又名如何优化不可预测的内存访问模式)
- C++平行的基数排序
- 基数排序函数出现问题
- 用于浮点运算的快速、基于秩的基数排序
- 使用int向量的向量对int向量进行基数排序
- 基数排序C++赋值
- 基数排序C++不屏蔽位
- 使用C++进行基数排序
- c++中对基数排序函数的浮点异常
- 使用位操作的c++基数排序
- 用基数排序实现std::sort的重载是否合法?