通常比较大小,我们直接就找到最大的位数的数。假设所有的数的位数都相同,根据对10的幂去模,从而保存进不同的集合;随着10的次幂的不断增大,数组排序完成了。
/**
*基数排序:
*核心思想:
* 1.首先获取最大的绝对值的数
* 2.求出最大的绝对值的数,是10的times次幂。
* 3.建立19个集合,分别保存个位是(-9,-8,-7,……,1,2,3,……8,9)的数
* 4. 根据times次幂建立外层循环for(int i=0;;)
* a. 获取对应的位的值
* b. 把每个数添加进相应的集合
* 5.收集数据
* @param array
*/
public void basicSort(int [] array) {
if(array == null && array.length ==0) {
return ;
}
int max =0;
//1获取最大的绝对值的数
for(int i =0;i<array.length;i++) {
if(Math.abs(max)<Math.abs(array[i])) {
max = array[i];
}
}
int times = 0;
if(max<0) max = -max;
//2求出最大的绝对值的数,是10的times次幂。
while(max >0) {
max = max/10;
times ++;
}
List<ArrayList> queue = new ArrayList<ArrayList>();
//3建立19集合,分别保存个位是(-9,-8,-7,……,1,2,3,……8,9)的数
for(int i =0;i<20;i++) {
ArrayList q = new ArrayList();
queue.add(q);
}
//4根据位数循环
for(int i =0 ;i<times;i++) {
//把每个数添加进相应的集合
for(int j =0; j<array.length;j++) {
//4.1获取对应的位的值
int x = array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);
ArrayList q = queue.get(10+x);
//4.2把每个数添加进相应的集合
q.add(array[j]);
queue.set(10+x, q);
}
//5开始收集
int count=0;
for(int j =0;j<20;j++) {
while(queue.get(j).size()>0) {
ArrayList<Integer> q = queue.get(j);
array[count] = q.get(0);
q.remove(0);
count++;
}
}
}
}