假設有一組長度爲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; }