假设我有一堆数字。我必须先将最不重要的数字放入相应的桶中。例如: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.但现在我卡住了。如何将此值放入存储桶?我必须使用指针数组来执行此操作。
我想了很久但还是找不到一个好办法。所以请与我分享一些想法。谢谢!
答案 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);