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

2025-01-20 20:05:31
推荐回答(2个)
回答1:

桶排的算法思想:

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

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


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

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


OK,到此,有了算法思想,下面给出代码。特别说明,下面的算法只是我个人为了演示,仅供参考,实际上应该有更加规范或更好的。

#include
#include
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"<  
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;
}

回答2:

http://www.cs.usfca.edu/~galles/visualization/BucketSort.html
给你看个桶排序的动画帮助理解