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

时间:2015-02-27 09:42:14

标签: c algorithm sorting openmp radix-sort

什么是在C中实现 Radix -sorting算法的最有效方法,它通过二进制表示(在整数数组上)进行排序?

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

有任何建议如何实现吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

有任何建议如何实现吗?

#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对该算法的描述符合这种实现方式,不同之处在于计算起始偏移直到需要它们为止。