开发者社区 问答 正文

请高手讲解c++中的桶排序,思路是怎样的,实现又是怎样的

请高手讲解c++中的桶排序,思路是怎样的,实现又是怎样的

展开
收起
知与谁同 2018-07-15 09:44:08 2292 分享 版权
2 条回答
写回答
取消 提交回答
  • http://www.cs.usfca.edu/~galles/visualization/BucketSort.html
    给你看个桶排序的动画帮助理解
    2019-07-17 22:49:58
    赞同 展开评论
  • 桶排的算法思想:

    1、通过构建一个空桶,空桶数量与待桶排数量一样,再将待排各个元素分配到每个桶。而此时有可能每个桶的元素数量不一样,可能会出现这样的情况:有的桶没有放任何元素,有的桶只有一个元素,有的桶不止一个元素可能会是2+以上。(可以利用一个标识来标记它是否为空桶,比如,我下面的代码是用-1来标记它为空桶)

    2、桶排公式,通过桶排公式=(待排元素最大值*待排元素数量)/待排元素最大值+1,这个公式决定待排元素应该放入哪个桶。它起决定作用。


    3、利用其它排序算法在对每个桶且桶元素大于2个以上元素的再次排序。

        其它排序算法是指,你可以用:冒泡排序算法,选择排序算法,直接插入排序算法,快速排序算法,堆排序算法,归并排序算法,希尔排序算法等等根据实际情况任选一种。


    OK,到此,有了算法思想,下面给出代码。特别说明,下面的算法只是我个人为了演示,仅供参考,实际上应该有更加规范或更好的。 #include<iostream>
    #include<time.h>
    using namespace std;

    #define ARR_MAX_SIZE 20
    #define RAND_MAX_NUMBER 999

    int main(int argc, char* argv[])
    {
    int arr[ARR_MAX_SIZE];                 // 待桶排序列
    int empty[ARR_MAX_SIZE][ARR_MAX_SIZE]; // 空桶

    for (int i = 0; i < ARR_MAX_SIZE;i++)
    for (int j = 0; j < ARR_MAX_SIZE; j++)
    empty[i][j] = -1;

    srand((unsigned)time(NULL));
    for (int i = 0; i < ARR_MAX_SIZE; i++){
    arr[i] = rand() % (RAND_MAX_NUMBER + 1); // 随机产生桶排数
    }

    for (int i = 0; i < ARR_MAX_SIZE; i++){

    if (i % 5==0)cout << endl;
    cout << arr[i] << "\t";
    }

    cout <<"\n"<<endl;
     
    for (int i = 0; i < ARR_MAX_SIZE; i++){

    int pr = 0;
    int index = (arr[i] * ARR_MAX_SIZE) / (RAND_MAX_NUMBER + 1);  // 桶排公式

    while (empty[pr++][index] >= 0);
    empty[--pr][index] = arr[i];// 模拟放入桶

    for (int k = 0; k < pr; k++){
    for (int m = 0; m < pr; m++)
    {   // 对各自桶再进行冒泡排序
    if (empty[m][index]>empty[m + 1][index]){
    int t = empty[m][index];
    empty[m][index] = empty[m + 1][index];
    empty[m + 1][index] = t;
    }
    }
    }
    }

    int count = 0;
    for (int i = 0; i < ARR_MAX_SIZE; i++){
    int pr = 0;

    while (empty[pr][i] >= 0){
    if (count++ % 5 == 0) cout << endl;
    cout << empty[pr][i] << "\t";
    pr++;
    }

    }


    return 0;
    }

    2019-07-17 22:49:58
    赞同 展开评论
问答分类:
C++
问答标签:
问答地址: