1.思想
1.1.例子
1.2.排序思想
1.每个数都是由0-9组成,开始创建10个箱子(序号0-9).
2.对待排序进行遍历,按照待排序个位数有序的添加对应箱子中,注意,是有序的添加.(这个可以使用快速排序,直接插入,选择插入…等).
3.顺序遍历所有的箱子.然后顺序的读取箱子中的值,顺序存储到数组中,此时这个数组就是有序的数组
注意:这里最多创建了10个箱子,如果知道了都是两位数,也可以创建0-99号箱子,每个箱子后面添加对应的值.(这种方法不推荐,浪费内存)
2.运行结果
3.算法实现
3.1 定义数据结构
//箱子后面链接的顺序表
typedef struct Seq{
//顺序的值,这里最多存储MAX个数,所以待排序数的也不可以超过MAX个.(扩展的基数排序中,用链表,就不用考虑个数了)
int array[MAX];
int length;//当前顺序表的长度
}BoxSeq;
//箱子排序的Bean
typedef struct Box{
int key;//排序的基数
BoxSeq seq;//箱子中顺序存储的数据(有序添加)
}B;
这里可以进行完善有两点:
1.可以将Seq和Box合并成一个,这个为了便于理解箱子的结构,所以这样定义的
2.箱子中的列表可以使用链表进行存储,这样就不用限制待排序的数量.这个在下面扩展的基数排序算法中进行了修改.
3.2 定义操作方法集合
/打印箱子
void logB(B box);
//往箱子中顺序添加数值,递增
void addValueToBox(B *b,int value);
//箱排序
void BoxSort(void);
//打印数组
void logArray(int array[],int length);
3.3 方法实现
//打印箱子
void logB(B box){
int i;
printf("[%d]->[",box.key);
for(i=0;i<box.seq.length;i++){
if(i==0)
printf("%d",box.seq.array[i]);
else
printf(",%d",box.seq.array[i]);
}
printf("]\n");
}
//往箱子中顺序添加数值,递增
void addValueToBox(B *b,int value){
//1.先找到插入的位置(找到第一个小于的value值的位置).
//10,13,15,17,比如要插入14,那么找到的位置就是2.
int i=0;
int j;
while (i<b->seq.length&&b->seq.array[i]!=-1) {
if(b->seq.array[i]<value)
i++;
else
break;
}
//2.移动i位置之后(包含i位置)之后的值
//10,13,14,15,17
for(j=b->seq.length-1;j>=i;j--)
b->seq.array[j+1]=b->seq.array[j];
//3.将添加的值(value)添加到i位置
b->seq.array[i]=value;
//4.然后length+1
b->seq.length=b->seq.length+1;
}
//打印数组
void logArray(int array[],int length){
int i;
printf("[");
for(i=0;i<length;i++){
if(i==0)
printf("%d",array[i]);
else
printf(",%d",array[i]);
}
printf("]\n");
}
//箱排序
void BoxSort(){
int i;
int count;
int j;
//1.初始化待排序的数组
int array[MAX];//待排序的数组
array[0]=88;
array[1]=19;
array[2]=13;
array[3]=78;
array[4]=43;
array[5]=15;
array[6]=22;
array[7]=16;
array[8]=83;
array[9]=10;
printf("待排序:");
logArray(array, MAX);
//2.因为待排序的数组是0-100之间,所以我们定义10个箱子
B boxs[MAX];//箱子列表
//num存储在箱子Bbox[num/10]中,添加的时候顺序添加.
//初始化箱子列表
for(i=0;i<MAX;i++){
boxs[i].key=i;
boxs[i].seq.length=0;
for(j=0;j<MAX;j++){
boxs[i].seq.array[j]=-1;
}
}
//3.遍历待排序数组
for(i=0;i<MAX;i++){
int bnum=array[i]/10;
//3.1.然后往对应的箱子中添加
addValueToBox(&boxs[bnum],array[i]);
}
count=0;
//4.遍历箱子,组装成有序数组
for(i=0;i<MAX;i++){
//4.1如果此时的箱子长度不为空
//打印所有箱子中的数据
logB(boxs[i]);
if(boxs[i].seq.length>0){
//4.2.遍历当前箱子然后顺序输出,添加到数组中
for(j=0;j<boxs[i].seq.length;j++)
array[count++]=boxs[i].seq.array[j];
}
}
//5.打印排序好的数组
printf("已排序:");
logArray(array, MAX);
}
对桶排序(箱排序)的扩展是基数排序