桶排序(Bucket Sort)
1. 基本思想
简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的再进行排序。
步骤
- 划分桶
- 入桶
- 桶内排序
- 出桶
2. 排序流程
例如对[0, 40]范围内的n个整数A[1..n]排序 。
首先,可以把桶设为大小为10的范围,具体而言,设集合B[1]存储[0, 10)的整数,集合B[2]存储[10, 20)的整数,……集合B[i]存储 [(i−1)∗10,i∗10) 的整数, i=1,2,3,4 ,总共有4个桶。
然后,对A[1..n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中。 再对这4个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任何排序法都可以。
最后,依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这样就得到所有数字排好序的一个序列了。
3. 算法实现
代码
#include <stdio.h>
#define N 13
#define NBUCKET 4
int array[N]={
11, 23, 17, 35, 6, 19, 24, 1, 30, 29, 7, 11, 22};
int bucket[NBUCKET][N]={
0}; /* 以排序0~40间的数为列,分为4个桶[0,10),[10,20),[20,30),[30,40) */
int b_index[NBUCKET]={
0}; /* 记录每隔桶中存放的数据个数 */
/* 打印数组 */
void print_array(int arr[],int len)
{
int i;
for(i=0;i<N;i++)
printf("%d ",arr[i]);
printf("\n");
}
/* 打印桶 */