这种c ++实现的珠子排序算法如何工作?

时间:2012-12-04 22:09:48

标签: c++ algorithm sorting

我一直试图理解这段代码几个小时都没有成功。我编写了自己的珠子排序算法版本,但它很慢。 我想知道为什么这个工作如此快速。 以下是关于珠子排序算法的信息:
http://demonstrations.wolfram.com/ExtendedBeadSort/
你能帮我理解这个算法的工作原理吗?

#include <iostream>
#include <vector>

using std::cout;
using std::vector;

void distribute(int dist, vector<int> &List) {
    //*beads* go down into different buckets using gravity (addition).
    if (dist > List.size() )
        List.resize(dist); //resize if too big for current vector

    for (int i=0; i < dist; i++)
        List[i]++;
}

vector<int> beadSort(int *myints, int n) {
    vector<int> list, list2, fifth (myints, myints + n);
    cout << "sakums\n";
    cout << myints<< "\n";
 //   for (vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it) cout << " " << *it << "\n";
    cout << "beigas\n";

    cout << "#1 Beads falling down: ";
    for (int i=0; i < fifth.size(); i++)
        distribute (fifth[i], list);
    cout << '\n';

    cout << "\nBeads on their sides: ";
    for (int i=0; i < list.size(); i++)
        cout << " " << list[i];
    cout << '\n';

    //second part

    cout << "#2 Beads right side up: ";
    for (int i=0; i < list.size(); i++)
        distribute (list[i], list2);
    cout << '\n';

    return list2;
}

int main() {
    int myints[] = {734,3,1,24,324,324,32,432,42,3,4,1,1};
    vector<int> sorted = beadSort(myints, sizeof(myints)/sizeof(int));
    cout << "Sorted list/array";
    for(unsigned int i=0; i<sorted.size(); i++)
        cout << sorted[i] << ' ';
    system("PAUSE");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

我的实施!我是你在rosettacode上看到的C ++中珠子排序的原始作者。

算法速度太慢的原因是因为这种类型有三个主要的减速问题。每当分布运行O(S)时,一个处理向量的潜在大小调整。这也与每个“极”O(S)+ O(S)或O(2S)逐个实际添加数字相结合,然后这样做n次,其中n是要排序的数字O(n )+ O(2S)。由于S在大多数情况下仍然较大,因此算法仍为O(S)。

公平地说,只需要有人制作更好的实现和更简洁的代码版本来提高性能。我以这种方式制作了这种算法,以便尽可能轻松地展示新的珠子排序。

如果您想了解更多信息,请查看珠子排序的维基页面。

答案 1 :(得分:0)

由于分发如何运作:

其他每个数字都为插槽提供了“珠子” - 有13个数字,所以当第一遍完成时,插槽1中有13个。

它在“列”中“分发”珠子。当你打印它的侧面时,现在有734个插槽 - 最大的数字。

当分布再次运行时,它会通过对列进行求和来将“珠子”向下移动 - 它将根据最大元素执行多项添加*数字的数量 - 加上内存分配