使用C++进行基数排序
Radix Sort using C++
假设我有一堆数字。我必须首先将最低有效数字放入相应的桶中。例: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);
}
但我可能误解了这个问题。如果你正在做一些不同于基数排序的事情,请添加一些细节。
C++不是我的强项,但这段来自wikipedia Raidex Sort的代码非常全面,可能比您迄今为止实现的更像C++。希望它能帮助
这是C++,我们不再使用malloc
。我们使用集装箱。二维数组是向量中的一个向量。
vector<vector<int> > bucket(10);
left = (a->value)%10;
bucket[left].push_back(a->value);
相关文章:
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++基数排序的有效方法
- 基数排序函数不适用于基数 2?
- 基数排序需要使用常量值进行修复
- 基数排序256性能
- C++:使用 LSD 基数排序字符串排序崩溃
- 就地快速基数排序实现
- 最高有效位基数排序如何比最低有效位基数分类更有效
- 霍勒里斯的基数排序
- 如何优化间接基数排序?(又名如何优化不可预测的内存访问模式)
- C++平行的基数排序
- 基数排序函数出现问题
- 用于浮点运算的快速、基于秩的基数排序
- 使用int向量的向量对int向量进行基数排序
- 基数排序C++赋值
- 基数排序C++不屏蔽位
- 使用C++进行基数排序
- c++中对基数排序函数的浮点异常
- 使用位操作的c++基数排序
- 用基数排序实现std::sort的重载是否合法?