如何让BucketSort算法工作?

时间:2013-02-16 18:31:29

标签: c++ algorithm sorting bucket-sort

我正在尝试用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);
    }
}

1 个答案:

答案 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] );
}

我把物品正确插入水桶。