C中二进制表示的基数排序算法

Posted

技术标签:

【中文标题】C中二进制表示的基数排序算法【英文标题】:Radix-sort algorithm on the binary representation in C 【发布时间】:2015-02-27 09:42:14 【问题描述】:

在 C 中实现 Radix 排序算法的最有效方法是什么,该算法按二进制表示(在整数数组上)排序?

我希望能够给出一个数字 n 表示要排序的元素数量,以及一个值 b 告诉您想要多少个二进制数字在排序算法中被解释为一位数字,因此您可以根据数字的大小来改变 nb

对如何实现有任何建议?

【问题讨论】:

这个问题没有显示任何研究工作。请说得更具体些。 你应该先通过算法自己尝试。 【参考方案1】:

对如何实现有任何建议?

#include <string.h>
#include <limits.h>

void radixsort(unsigned int array[], int n, int b)

    unsigned int place[n], *a0 = array, *a1 = place, *a;
    int values = 1<<b, start[values+1], bmask = values-1, shift;
    for (shift = 0; shift < sizeof (int) * CHAR_BIT; shift += b)
    
        int i;
        memset(start, 0, sizeof start);
        for (i = 0; i < n; ++i) ++start[(a0[i]>>shift&bmask)+1];
        for (i = 2; i < values; ++i) start[i] += start[i-1];
        for (i = 0; i < n; ++i) a1[start[a0[i]>>shift&bmask]++] = a0[i];
        a = a0, a0 = a1, a1 = a;
    
    if (a0 != array) memcpy(array, a0, sizeof place);

事实证明,rcgldr 对算法的描述适合这种实现,只是在需要时才计算起始偏移量。

【讨论】:

【参考方案2】:

我使用的方法是对数据进行一次传递,以创建一组(矩阵)直方图,这些直方图是用于排序的每个位字段中位模式出现次数的直方图。这是基数排序的“计数”步骤。然后通过从零开始并累积直方图集中每个条目的计数总和,将直方图转换为起始索引偏移量。然后对每个位字段执行基数排序,从最低到最高顺序,使用与该位字段关联的起始索引并在使用时递增每个索引。维基文章:

http://en.wikipedia.org/wiki/Counting_sort

【讨论】:

以上是关于C中二进制表示的基数排序算法的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenMP 并行化 C 中的基数排序

使用二进制的基数排序

C++ 查找所有基数,使得这些基数中的 P 以 Q 的十进制表示形式结尾

以其他基数表示负数

数据结构Java版之基数排序

什么是基数排序?