基数排序的基本思路
521 123 496 333 224
假设有这几个数
排序的基本过程是
先获取这五个数各位上的数,根据数对号入桶(所以需要十个桶子,0~9的下标分别对应这是存放数字几的桶子)
第一次:
521入一号桶 123入三号桶 496入6号桶 333入三号桶 224入4号桶
再分别将0~9号桶中的数据取出 521 333 123 496 224
第二次:十位入桶
521 123 224 333 496 ———》 224 123 521 333 496
第三次:百位入桶
123 224 333 496 521 ———》 123 224 333 496 521
public static void radixSort(int [] array){ //根据每一遍的结果可以知道,要先获得最大数的长度 int max = 0; for (int i = 0; i < array.length; i++) { if (array[max] < array[i]){ max = i; } } int maxLength = (array[max] + "").length(); //用一个二维数组来当桶子存放数据,行从上到下存放数据,列就表示各个位的数对对应桶子 //各个位的数字的范围是0~10 ,每个桶子最多存放array.length个数据 int [] [] temp = new int[10][array.length]; //先从第一轮排序的情况分析 //count用来记录每个桶子中存放的数据的个数,count[0]对应的数字就是桶子0中的元素个数... int [] count = new int [10]; //遍历数组,根据个位信息对号入桶 int n = 0; int k = 1; while (n < maxLength){ for (int value : array) { int number = value / k % 10; temp[number][count[number]] = value; count[number]++; } //全部对号入桶之后再将入桶的数据全部取出 int index = 0; for (int i = 0; i < 10; i++) { if (count[i] != 0){ for (int j = 0; j < count[i]; j++) { array[index++] = temp[i][j]; } count[i] = 0; } } k *= 10; n ++; } }