使用C++进行基数排序

Radix Sort using C++

本文关键字:基数排序 C++ 使用      更新时间:2023-10-16

假设我有一堆数字。我必须首先将最低有效数字放入相应的桶中。例:530,我得先把0放入桶里。对于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。所以我想把这个->值放入bucket 0中。但现在我被卡住了。如何将此值放入桶中?我必须使用指针数组来完成此操作。

我想了很长时间,但还是找不到一个好的方法。所以请和我分享一些想法。谢谢!

有一种更简单的方法,您只需要一个nkeys大小的缓冲区,而不需要radix*nkeys空间。

分配可以容纳nkeys密钥的第二个缓冲区。现在,首先遍历您的数据,然后简单地计算每个存储桶中最终有多少个密钥。现在,您可以创建一个radix大小的指针数组,其中每个指针都指向输出缓冲区中该bucket的开头。最后,第二次通过数据移动键。每次移动关键点时,都要增加bucket指针。

以下是一些要制作成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);
}

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

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

C++不是我的强项,但这段来自wikipedia Raidex Sort的代码非常全面,可能比您迄今为止实现的更像C++。希望它能帮助

这是C++,我们不再使用malloc。我们使用集装箱。二维数组是向量中的一个向量。

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