桶排序,根据我的理解,比方说,地上放着排好顺序的11个木桶(标号为0-10),现在有一堆球,球的编码为0-10,比如编号为5的球有4,而编号为0的球0个,还有其他的球各若干个,现在要把他们分好类,从这堆球里面捡,若0号球,就放在标号为0的木桶上,1号球就放标号为1的木桶上,...... 分好类后,比如5号球有四个,木桶编号为5的就放着4个编号为5的球。现在一切就绪,就可以从0-10的木桶逐个拿出来了,按顺序拿出来的,也就完成了排序。
用java代码表示如下:
public static void main(String[] args) {
int M= 11;//木桶个数
int N = 100;//一堆球的个数
int[] array = new int[M];
Random r = new Random();
for (int i = 0; i < N; i++) {
int m = r.nextInt(M); //随机生成0-10编号的球
array[m] = array[m] + 1; //计算放在m编号木桶下球的数量
}
for (int i = 0; i < array.length; i++) {//按顺序从编号0-10的木桶取出来
for (int j = 0; j < array[i]; j++) {//重复打印第i个木桶放的编号为i的球
System.out.println(i);
}
}
}
桶排序,可以应用在成绩排序上,比如成绩最高分为100分,最低分0分,就可以设置101个木桶,把学生的成绩放在对应的木桶上,进行排序。桶排序也有局限性,就是桶的个数不能太大,若M很大,可想而知,new int[M],占用的内存空间将会很大,在64位的电脑上,占用的内存是M*4+12+4+内存对齐 byte
M*4(int 类型大小)
12(64位,header大小,32位的话为8)
4(存放数组长度大小)
内存对齐(计算得出的结果必须是8的倍数),比如M=11,占用的内存为64byte