基数排序,运用什么思想呢?用空间换时间
首先,创建一个类,类里面传一个数组,然后,在怎么办?
之后,就该分类,也就是按照数组里得个位十位百位的具体的数值,将其分配到对应的0,1,2,3下。
也就是说,我们要新建一个二维数组,用来存放临时数据。
存放完之后,将其,放入到原来的数组中,再将临时数组置空。
这样循环下来,按照最大位数的大小,也就是有几位,就循环几次,几次下来,也就排序完成了。
当然,也要小心一下数组越界的情况,可能你的位数分配的不均匀,也就是,你的个位十位数太多了,导致数组越界的情况,根据实际情况,将数组的值赋好。
具体代码如下:
package com.bai.sort;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] arr = {10, 5, 2, 4, 512, 84, 960, 452, 31};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr) {
//存取数组最大值
int max = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
//计算最大值的长度
int maxLength = (max + "").length();
//用于临时存储数据的数组
int[][] temp = new int[10][arr.length+2];
//用于记录在temp中相应的数组中存放的数字的数量
int[] counts = new int[arr.length+2];
//用最大值的长度来决定比较的次数
for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
for (int j = 0; j < arr.length; j++) {
//计算余数
int ys = arr[j] / n % 10;
//放数
temp[ys][counts[ys]]=arr[j];
//记录数量
counts[ys]++;
}
//记录取出的元素需要放的位置
int index = 0;
//把数字取出来
for (int k = 0;k<counts.length;k++){
//记录数量的数组中当前余数记录的数量不为0
if (counts[k]!=0){
//循环取出元素
for (int l=0;l<counts[k];l++){
arr[index++]=temp[k][l];
}
//把数量置空
counts[k]=0;
}
}
}
}
}