我正在尝试用C ++创建一个bucketsort算法,但它根本不起作用。每次运行时,它都会添加许多新数字,通常非常大,例如数十亿,进入数组。有人知道为什么吗?这是代码 - (请注意,我传入一个大小为100的数组,随机数从0到~37000,并且插入排序功能完全正常并经过多次测试)
如果有人能够指出什么是错的,那将非常感激。
void bucketSort(int* n, int k)
{
int c = int(floor(k/10)), s = *n, l = *n;
for(int i = 0; i < k; i++) {
if(s > *(n + i)) s = *(n + i);
else if(l < *(n + i)) l = *(n + i);
}
int bucket[c][k + 1];
for(int i = 0; i < c; i++) {
bucket[i][k] = 0;
}
for(int i = 0; i < k; i++) {
for(int j = 0; j < c; j++) {
if(*(n + i) >= (l - s)*j/c) {
continue;
} else {
bucket[j][bucket[j][k]++] = *(n + i);
break;
}
}
}
for(int i = 0; i < c; i++) {
insertionSort(&bucket[i][0], k);
}
}
答案 0 :(得分:0)
此行无法编译。 int bucket[c][k + 1];
我认为问题在于您的桶指数。这部分在这里
for(int j = 0; j < c; j++) {
if(*(n + i) >= (l - s)*j/c) {
continue;
} else {
bucket[j][bucket[j][k]++] = *(n + i);
break;
}
}
不能完全相同:
insert n[i] into bucket[ bucketIndexFor( n[i]) ]
首先它将索引关闭一个。因此,它也错过了最后一桶的数字的中断。还引入了一个小错误,因为索引计算使用范围[0,l-s]
而不是[s,l]
,如果s
等于0
,则只会相同。
当我将bucketIndex
写为:
int bucketIndex( int n, int c, int s, int l )
{
for(int j = 1; j <= c; j++) {
if(n > s + (l-s)*j/c) {
continue;
} else {
return j-1;
}
}
return c-1;
}
并将算法的主要部分重写为:
std::vector< std::vector<int> > bucket( c );
for(int i = 0; i < k; i++) {
bucket[ bucketIndex( n[i], c, s, l ) ].push_back( n[i] );
}
我把物品正确插入水桶。