繁体   English   中英

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

[英]Radix-sort algorithm on the binary representation in C

在C中实现以基数表示(在整数数组上)排序的Radix排序算法的最有效方法是什么?

我希望能够给出一个代表要排序的元素数量的数字n ,以及一个值b ,该值告诉您要在排序算法中将多少个二进制数字解释为一位数字,以便您可以更改nb取决于您的人数。

有什么建议如何实现呢?

有什么建议如何实现呢?

#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对算法的描述符合此实现,只是开始偏移量是在需要时才计算的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM