Radix使用C ++排序

时间:2012-03-04 23:13:40

标签: c++ radix-sort

假设我有一堆数字。我必须先将最不重要的数字放入相应的桶中。例如:530,我必须首先放入桶中。对于61号,我必须放入桶1。

我计划使用多维数组来执行此操作。所以我创建了一个2维数组,其中nrows为10(0~9),ncolumns为999999(因为我不知道列表有多大):

    int nrows = 10;
    int ncolumns = 999999;

    int **array_for_bucket = (int **)malloc(nrows * sizeof(int *));
         for(i = 0; i < nrows; i++)
             array_for_bucket[i] = (int *)malloc(ncolumns * sizeof(int));

    left = (a->value)%10;
    array_for_bucket[left][?? ] = a->value;

然后我创建了一个节点调用a。在这个节点a中,有一个值50.为了找出我想要放入哪个桶,我计算“左”,然后我得到0.所以我想把它放在a-&gt;价值进入桶0.但现在我卡住了。如何将此值放入存储桶?我必须使用指针数组来执行此操作。

我想了很久但还是找不到一个好办法。所以请与我分享一些想法。谢谢!

4 个答案:

答案 0 :(得分:1)

有一种更简单的方法可以做到这一点,而不是radix*nkeys空间,只需要一个nkeys大小的缓冲区。

分配适合nkeys个密钥的第二个缓冲区。现在,首先浏览您的数据,然后只计算每个桶中的密钥数量。您现在可以创建一个radix大小的指针数组,其中每个指针都指向输出缓冲区中该存储桶的开头。最后,第二次通过数据移动键。每次移动键时,都会增加该桶指针。

以下是C ++中的一些C代码:

void radix_sort(int *keys, int nkeys)
{
    int *shadow = malloc(nkeys * sizeof(*keys));

    int bucket_count[10];
    int *bucket_ptrs[10];
    int i;

    for (i = 0; i < 10; i++)
        bucket_count[i] = 0;

    for (i = 0; i < nkeys; i++)
        bucket_count[keys[i] % 10]++;

    bucket_ptrs[0] = shadow;
    for (i = 1; i < 10; i++)
        bucket_ptrs[i] = bucket_ptrs[i-1] + bucket_count[i-1];

    for (i = 0; i < nkeys; i++)
        *(bucket_ptrs[keys[i] % 10]++) = keys[i];

    //shadow now has the sorted keys

    free(shadow);
}

但我可能误解了这个问题。如果你做的事情与基数排序略有不同,请添加一些细节。

答案 1 :(得分:0)

如果要存储指针,请查看Boost Pointer containers库。

答案 2 :(得分:0)

C ++不是我的强项,但来自wikipedia-Raidx Sort的代码非常全面,可能比你到目前为止实现的更多C ++。希望它有所帮助

答案 3 :(得分:-1)

这是C ++,我们不再使用malloc了。我们使用容器。二维数组是向量的向量。

vector<vector<int> > bucket(10);
left = (a->value)%10;
bucket[left].push_back(a->value);