在800万数据的时候比希尔 要快 ,比快速 ,归并要快
但是占内存空间过大,8000万,会造成堆溢出,现在写法不能比较负数
需要创建一个二维数组用于排序,一个一位数组用于下标存储。
package a;
import java.util.Arrays;
public class Radix {
public static void main(String[] args) {
int var = 8000000;
// int var = 8;
int [] arr = new int[var];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random()*900000000);
}
long be = System.currentTimeMillis();
// int [] arr = {53, 3, 542, 748, 14, 214};
radix(arr);
long end = System.currentTimeMillis();
System.out.println(end-be);
System.out.println("Arrays.toString(arr) = " + Arrays.toString(arr));
// int max = findmaxlength(arr);
}
private static int findmaxlength(int[] arr) {
int res = arr[0];
for (int i = 0; i < arr.length; i++) {
if (res < arr[i]) {
res = arr[i];
}
}
res = (res+"").length();
return res;
}
private static void radix(int[] arr) {
int[][] bucket = new int[10][arr.length];
int index[] = new int[10];
for (int j = 0,n=1; j < findmaxlength(arr); j++,n*=10) {
for (int i = 0; i < arr.length; i++) {//将arr的值放入对应位置
int end = arr[i] /n % 10;//这个值用于找到桶,也用于找到存储的下标
bucket[end][index[end]]=arr[i];
index[end]++;
}
int sta=0;
for (int i = 0; i < bucket.length; i++) {
if (index[i] != 0) {
//因为上面的 ++ ,所以如果有值就是1了
for (int k = 0; k < index[i]; k++) {
arr[sta++] = bucket[i][k];
}
}
index[i]=0;
}
}
}
}
来源:CSDN
作者:Be_With_I
链接:https://blog.csdn.net/Be_With_I/article/details/104312503