桶排序没有那么复杂
个人觉得,桶排序不比快速排序需要调用自己本身,这对于很多刚学数据结构或编程小白来说,可以少理解一个抽象的递归,排序性能又实在是比傻瓜式的冒泡排序高出好几个数量级。其真正排序过程又实在是简单易懂,还是建议新手朋友们学起来呀。
理解桶排序
我把自己在学习桶排序的过程中的新的体会尽量用简单的语言描述出来,希望能帮助到一些初学者。下面先介绍过程:
桶排序顾名思义用桶对数据进行排序,但是我们需要十个桶,分别代表0~9这个十个数字。
接下来的工作就是把需要排序的一堆无序数字借助这个十个桶进行排序。
第一次,按照所有数的个位数分类,分别把每个数放进对应数字的桶里。
桶排序过程图解
待排序的数为: 28,45,17,33,57,62,80,39,按其个位数分别放入对应的桶里,如下图所示:
第一遍排序后十个桶里分别是
第一遍进桶后出桶,按从0->9的顺序重新存进数组里:
80,62,33,45,17,57,28,39
至此完成一进一出,由于该组数全部是两位数,所以整个排序过程需要两进两出,以此类推三位数需要完成三进三出。
第二遍进桶,按照其十位数字依次进桶:
二出:
17,28,33,39,45,57,62,80
至此,已完成该两位数数组的排序,若需排序的数组含有三位数,那么第三次进桶则按其百位数从0->9的顺序再依次进桶,后依次出桶。
下面上代码
桶排序代码
以两位数为例,两进两出
设立十个数组,代表数字0~9
第一遍 进 按照每个数的个位数 存放进对应 列下标的二维数组中的格子里,
第二遍 进 按照每个数的十位数 存放进对应 列下标的二维数组中的格子里,
// An highlighted block
int u = 10;
int[][] arr = new int[u][n];
int l = String.valueOf(n).length()+1;
//idx数组存放 0~9每一个数字对应存放了几个数字
int[] idx = new int[u];
for (int i = 0; i < l; i++) {
//1、当前数位提取和存放
for (int j = 0,t; j < n; j++) {
//提取当前数位的值 t存放当前数位的值,且为当前数值在二维数组中的第一个维度
t = (array[j]/(int)Math.pow(u,i))%u;
arr[t][idx[t]++] = array[j];
}
//2、提取数据,放回数组
//j控制循环十次。因为存放每一个数字对应存放元素数量的数组idx 长度为10 需要遍历10次
//m存放放回原数组时每个数的对应下标
for (int j = 0,m = 0 ; j < u; j++) {
//idx[j]存放对应数位存了几位数字,如果对应数位没有数字,直接看下一个数字所代表的数位,
// 如果存了数,即个数不为0 存了几个数字,循环取几次数
if(idx[j]==0)
{
continue;
}
for (int k = 0; k < idx[j]; k++) {
array[m++] = arr[j][k];
}
}
//3、还原计数 即每次循环结束后统计对应数位存了元素个数的值归零
for (int j = 0; j < u; j++) {
idx[j]=0;
}
}