1.算法原理
鸽巢排序是对桶排序算法的改进,只是桶中装对应下标放元素出现的次数
待排序数组:a[14] ={ 6, 6, 2, 2, 2, 4, 1, 1, 1, 5, 5, 5, 5, 9 };
桶中: bucket[10]=0 3 3 0 1 4 2 0 0 1
1出次3次,所以bucket[1]=3
2出次3次,所以bucket[2]=3
4出次1次,所以bucket[4]=1
5出次4次,所以bucket[5]=4
6出次2次,所以bucket[6]=2
9出次1次,所以bucket[9]=1
2.代码实现
#include <stdio.h>
//printArray打印出数组
void printArray(int a[],int size){
// printf("数组为:[%d] ",a[0]);
for (int i=0;i<size;i++)
{
printf(" %x ",a[i]);
}
printf("\n");
}
void main()
{
int a[14] ={ 6, 6, 2, 2, 2, 4, 1, 1, 1, 5, 5, 5, 5, 9 };
int len=14;
//分配空桶
int bucket[10]={0} ;
printf("排序前:");
printArray(a,len);
//直接以每个待排数字为索引,将自己的值赋值给当前桶
for (int i = 0; i < len; i++) {
bucket[a[i]]++;
}
printf("桶中:");
printArray(bucket,10);
//跳过值为0的空桶,顺序输出即可
int temp=0;
for (int j = 0; j < 10; j++){
while(bucket[j]-->0)
a[temp++]=j;
}
printf("排序后:");
printArray(a,len);
}
3.排序结果
排序前: 6 6 2 2 2 4 1 1 1 5 5 5 5 9
桶中: 0 3 3 0 1 4 2 0 0 1
排序后: 1 1 1 2 2 2 4 5 5 5 5 6 6 9