用空间换时间,他用一个二维数组(10*n)和一位数组(1*10),用于排序的道具,该排序不是依据的传统的比较的思想,她是采用,先让所有元素按照个位的数字,放在二维数组中(二维数组中,第一维:个位、十位、百位...,第二位用于盛放数据:一个数据、两个数据...),然后以为数组记录每个个位数组里数据的数量,然后再将二维数组中的数据,依据从小到大的顺序拿出来,这个新组成的数据,就是第一轮排序后的结果。
以此类推,完成十位、百位的排序...
package Sort;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {34,12,890,443,789,32,18,90};
RadixSort radixSort = new RadixSort();
radixSort.Radix(arr);
System.out.println(Arrays.toString(arr));
}
//基数排序:用空间换时间
//思路:
//1、首先找到数组中元素位数最多的那一位,看看他有几位组成,就遍历几次
//2、生成一个10*n的二维数组,大小和arr.length一样。在生成个一维数组,用于记录每个每个桶里有几个元素
//3、开始遍历,先从各个元素的个位开始遍历,从小到大放在数组中,放入后,在依次取出来,这就完成了一次遍历
//4、然后继续遍历,直到遍历完。
public void Radix(int[] arr) {
if(arr.length == 0) {
return;
}
//定义一个二维数组,用于存放数组
int[][] arr2 = new int[10][arr.length];
//定义一个一维数组,用于计数
int[] arr1 = new int[10];
int max = 0;//最大元素
for(int i = 0; i < arr.length; i++) {
if(max < arr[i]) {
max = arr[i];
}
}
//看最大元素有几位数组成
max = (max +"").length();//比如345,那么max = 3
int temp;
int index;
//遍历max次,
for(int i = 0 ,n = 1; i < max; i++ , n *= 10) {
//n:用于取个位、十位、百位...放入arr2中
for(int j = 0; j < arr.length; j++) {
temp = arr[j] / n % 10;
arr2[temp][arr1[temp]++] = arr[j];
}
index = 0;
//将arr2元素取出来,重新合在一起
for(int k = 0; k < 10; k++) {
if(arr1[k] != 0) {
for(int m = 0;m < arr1[k]; m++) {
arr[index++] = arr2[k][m];
}
}
arr1[k] = 0;
}
}
}
}