再读BUDDY算法 http://blog.csdn.net/lights_joy/article/details/2732441
著名的大数量的排序算法--K桶排序法~在数据文本式的大数据排序时,K桶法会是一个不错的选择! k桶法:k桶法有两个主要步骤:分桶,整合。 分桶:把n个数依次放入k个桶中,除了第k个桶外,放入前k 1个桶中的数都要求后一个大于 前一个。分桶的具体规则如下: 第1个数放入第一个桶内,第2个数若大于第一个桶中的数(即第一个数)则放入第一个桶内, 否则放入第二桶内,以此类推。设现要将第j个数放入某桶中,先从第一个桶试起,若第j个 数大于当前第一个桶中最后一个数,则放入第一个桶中,否则试放第二个桶,以此类推,若 前k 1个桶都不能放入,则直接放入第k个桶。 整合:把k个桶中当前排在最前面的数中最小者依次放回到原数组中,直到k个桶空为止。 若整合后的数组已排好序,则算法停止,否则重新分桶、整合,直到排好序为止。
桶排序
- 问题描述
有一组n个无序数,用桶排序的方法对其进行排序,输出,编程实现并分析实验结果。
- 设计思想
桶排序:预设10个桶标号0-9,用链表实现。对于n个无序数。第1次排序,取每个数第1位放于相应标号的桶中。然后第i次排序(i从2开始),从号桶开始取数先放先取出,将数复制到数组中,然后去每个数的第i位,放入相应序号的桶中,依次列推,知道每个数组的位数去完为止。
- 编程
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
int a[1000];
int lenth;
struct bucket{
int b;
struct bucket *next;
}bucket_sort[10];
void insert(int n,int i){
struct bucket *pb,*p;
pb=(struct bucket *)malloc(sizeof(struct bucket));
pb->b=n;
pb->next=NULL;
if(!bucket_sort[i].next)bucket_sort[i].next=pb;
else{
p=bucket_sort[i].next;
while(p->next){
p=p->next;
}
p->next=pb;
}
}
int return_bit(int n,int i){
int k;
k=n;
if(i>1)k=n/(pow(10,(i-1)));
if(k==0&&i!=1)k=-1;
else k=k%10;
return k;
}
void init(){
int i;
for(i=0;i<10;i++){
bucket_sort[i].next=NULL;
}
}
void in_ab(){
int i,j=0;
struct bucket *p;
for(i=0;i<10;i++){
p=bucket_sort[i].next;
while(p){
a[j]=p->b;
p=p->next;
j++;
}
}
init();
}
void bucketsort(){
int sign,i,k,flog=1;
init();
while(1){
sign=0;
for(i=0;i<lenth;i++){
k=return_bit(a[i],flog);
if(k!=-1){
insert(a[i],k);
sign=1;
}
}
if(sign==0){in_ab();return;}
else in_ab();
flog++;
}
}
void main(){
int i;
printf("Please input the number:");
scanf("%d",&lenth);
printf("Please input :");
for(i=0;i<lenth;i++){
scanf("%d",&a[i]);
}
bucketsort();
for(i=0;i<lenth;i++){
printf("%d ",a[i]);
}
printf("\n");
getch();
}
- 结果分析
- 结果显示
2.算法优劣
桶排序算法的时间复杂度为O(n)。在排序算法中比较快,但是桶排序的使用范围比较窄。