如数组:{458--296--13--7--697--61}
排序思想:
1,先按个位上的数字大小顺序排列,结果为61--13--296--7--697--458
2,在上述顺序的基础上,按十位上的大小顺序排列,结果为:7--13--458--61--296
3,在上述顺序的基础上,按百位上的大小顺序排列,结果为:7--13--61--296--458
对于上述,最大数是三位数的数组,只需进行三趟排序即可得到正确的结果;
排序趟数:3(即最大数的位数)
排序原理:桶排序
每个数字的单独一位上(比如个位)的数字只可能是10个,即0~9,那么就建10个桶,分别装对应的数(如第一趟个位是2的放进2号桶里,第二趟十位是2的放进2号桶里),每趟放完之后,在从0~9号桶中依次取出数字,即可得到每趟的排序结果。建桶小提示:(可以用list套list集合的方式--即一个大房间里放10个桶(一个大list集合里放10个小list集合,每个小集合的下标代表它是几号桶))
代码实现如下:
//建一个方法用来计算10的次幂运算;
public static int pow(int n){
int value = 1;
for (int i = 1; i <= n; i++) {
value *= 10;
}
return value;
}
//方法主体;
public static void radixSort(int[] array){
//得到最大那个数的位数,确定要循环几次
int max = array[0];
for (int i = 1; i < array.length; i++) {
if (max < array[i]) {
max = array[i];
}
}
int maxLen = String.valueOf(max).length();
//建立10个桶,
ArrayList<ArrayList<Integer>> list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add(new ArrayList<Integer>());
}
for (int i = 0; i < maxLen; i++) {
//根据循环次数的不同,依次求出个、十、百位;并根据下标往桶里加数;
for (int j = 0; j < array.length; j++) {
int a = array[j] / pow(i) % 10;
list.get(a).add(array[j]);
}
//从桶里把数一个个按次序拿出来,依次将原来的数组覆盖,完成一个位数的排序
int n = 0;
for (ArrayList<Integer> list2 : list) {
if(list2.size() > 0){
for (Integer temp : list2) {
array[n] = temp.intValue();
n ++;
}
}
list2.clear();//用完之后就清空,等待下一次使用
}
}
}