桶排序是拿空间换时间,在数量特别大,桶很多的时候速度比快速排序还要快一些。(但是如果数量过百万可能会内存溢出(数组太长))
设置10个数组(代表0-9号桶)
先按从个位一次放入对应桶中,然后依次取出放回数组。
然后按十位。。。
百位。。。
。。。
直到最高位都为0.
123,125,214,243,222
第一次(个位):
2: 222
3:123,243
4:214
5:125
然后取出: 222,123,243,214,125
第二次(10位)
1:214
2:222,123,125
4:243
然后取出:214,222,123,125,243
第3次(100位)
1:123,125
2:214,222,243
然后取出:123,125,214,222,243
没有1000位,所以排序结束
其实本质就是按位比较。
//桶排序
public void bucketSort(int[] a) {
//先要得到最大的位数,判断循环多少次
int max = a[0];
for (int i = 0; i < a.length; i++) {
if (max < a[i]) {
max = a[i];
}
}
//此时max就是最大值
int maxlength = ("" + max).length(); //先把max变成字符串然后取长度,得到位数
int n = 1; //被除数 第一次是1,第二次是10(这样比如1212/10 = 121 ,然后再对10取余,得到10位的1),第三次是100 ..
for (int k = 0; k < maxlength; k++, n = n*10) {//每次被除数 * 10
int[][] bucket = new int[10][a.length]; //10个桶
int[] b_max = new int[10]; //记录10个桶内数据的数量方便插入 java的int型默认值是0,所以不赋值也能用.
for (int j = 0; j < a.length; j++) {
int num = (a[j] / n % 10); //用取余得到当前位 ps: % 和 / 优先级一样,所以错左向右计算
bucket[num][b_max[num]] = a[j];
b_max[num]++;
}
//放完桶后,取出回装
int a_max = 0; //用来往a回存
for (int i = 0; i < 10; i++) { //遍历10个桶
for (int j = 0; j < b_max[i]; j++) { //遍历其中第i个桶
a[a_max] = bucket[i][j];
a_max++;
}
}
}
//循环完毕后,a中的数值已经是排序好的了。
}