桶排序(Bucket Sort)

基本思想

假设有一组长度为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;
}
相关文章
相关标签/搜索