假设有一组长度为N的待排关键字序列K[1....n]。首先将这个序列划分红M个的子区间(桶) 。而后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) ,那么该关键字k就做为B[i]中的元素(每一个桶B[i]都是一组大小为N/M的序列)。接着对每一个桶B[i]中的全部元素进行比较排序(可使用快排)。而后依次枚举输出B[0]....B[M]中的所有内容便是一个有序序列。ios
bindex=f(key) 其中,bindex 为桶数组B的下标(即第bindex个桶), k为待排序列的关键字。桶排序之因此可以高效,其关键在于这个映射函数,它必须作到:若是关键字k1<k2,那么f(k1)<=f(k2)。也就是说B(i)中的最小数据都要大于B(i-1)中最大数据。很显然,映射函数的肯定与数据自己的特色有很大的关系,咱们下面举个例子:数组
假如待排序列K= {4九、 38 、 3五、 97 、 7六、 73 、 2七、 49 }。这些数据所有在1—100之间。所以咱们定制10个桶,而后肯定映射函数f(k)=k/10。则第一个关键字49将定位到第4个桶中(49/10=4)。依次将全部关键字所有堆入桶中,并在每一个非空的桶中进行快速排序后获得以下图所示:函数
对上图只要顺序输出每一个B[i]中的数据就能够获得有序序列了。大数据
#include<iostream> using namespace std; //约定全部数据都是在0-100的天然数 int data[30]={49,48,35,97,76,3,27,59,5,6,7,8,9,0,22,33,44,55,66,65,78,11,23,24,25,26,27,28,29,30}; typedef struct BucketSet{ int key; struct BucketSet * next; }; int myBucketSort(int data[],int length){ BucketSet bs[10]; for(int i=0;i<10;i++){ bs[i].key=i; bs[i].next=0; } for(int i=0;i<length;i++){ BucketSet *nextBS=(BucketSet *)malloc(sizeof(BucketSet)); nextBS->key=data[i]; //入桶 BucketSet *temp=&bs[data[i]/10]; BucketSet *tempNext=temp->next; while(tempNext && tempNext->key<nextBS->key){ temp=temp->next; tempNext=temp->next; } temp->next=nextBS; nextBS->next=tempNext; } //排序 int j=0; for(int i=0;i<10;i++){ BucketSet *temp=bs[i].next; while(temp){ data[j++]=temp->key; temp=temp->next; } } return 0; } int main(){ myBucketSort(data,30); for(int i=0;i<30;i++) cout<<data[i]<<" "; getchar(); return 0; }