java -算法 - 桶排序
桶排序是拿空间换时间,在数量特别大,桶很多的时候速度比快速排序还要快一些。(但是如果数量过百万可能会内存溢出(数组太长))
设置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中的数值已经是排序好的了。 }