Java基数排序
- java基数排序,又称为“桶子发”。具体是通过各个键值对应的数组下标,将数据装进桶中(二维数组每一列为一个桶,多个数据为多行)。
- 1.将待排序的数组中最大的数找出,得到他的长度,即位数。其他较小的数,也以同样位数对待。没有的以“0”代替。例如0001,但是在代码中不需要转为string类型来获取这一结果。使用int digitE = arr[j]/n%10;来获取每位数,没有得0。
- 2.创建二维数组,即桶。new int[10][arr.length]。其中10代表每一位数据从0-9这十个数,代表十个桶。创建一个计数数组来统计每个桶中存放了多少数据。计数数组的下标与二位数组对应。
- 3.数据装桶。根据个位的数据将待排数据存入桶中,之后再按顺序将同种的数据返回到待排数组中,完成了一次排序;下一次排序使用十位数据,进行排序,以此类推。达到maxSize(最大的输数的长度)
以下图片来自尚学堂
代码实现
package sort;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class RedixSort {
public static void main(String[] args) {
int[] arr = new int[800000];
for (int i = 0; i < arr.length; i++) {
arr[i] =(int)(Math.random()*8000);
}
int[] temp =new int[arr.length];
Date date1 = new Date();
SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String dateString1 = simpleDateFormat.format(date1);
System.out.println(dateString1);
redixSort(arr);
Date date2 = new Date();
String dateString2 = simpleDateFormat.format(date2);
System.out.println(dateString2);
}
public static void redixSort(int[] arr) {
//1得到数组中最大的数的位数
int maxValue = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>maxValue) {
maxValue = arr[i];
}
}
int maxSize = (maxValue+"").length();
//定义一个二维数组表示10个同
int[][] bucket = new int[10][arr.length];
//各个桶的数据个数数组。
int[] bucketElecountNumber = new int[10];
//数据装桶
for(int i = 0,n= 1;i<maxSize;i++,n*=10) {
for(int j = 0 ; j<arr.length;j++) {
int digitE = arr[j]/n%10;//每位对应的数据
bucket[digitE][bucketElecountNumber[digitE]] = arr[j];
bucketElecountNumber[digitE]++;
// System.out.println(Arrays.toString(bucketElecountNumber));
}
//将桶中的数据按照顺序放回原来的数组
int index = 0;
for (int j = 0; j < bucketElecountNumber.length; j++) {
if(bucketElecountNumber[j] != 0) {
//说明此桶里存有数据
for (int j2 = 0; j2 < bucketElecountNumber[j]; j2++) {
arr[index++] = bucket[j][j2];
}
}
//数据放回之后bucketElecountNumber【j】清零
bucketElecountNumber[j] = 0;
}
}
}
}
在随机生成的80000个数据,进行排序。
2019-08-13 12:06:29 457
2019-08-13 12:06:29 586
在下面超链接使用的归并排序,同样排序随机产生的8000个数据,使用了200多毫秒
java归并排序
这就涉及到算法的时间复杂度关系,归并排序为O(Nlog2N),基数排序为(n*k),n为数据个数,k为最大数据位数。所以基数排序还会因为数据的大小影响效率,但是影响不会太大,相对与上万个数据,十位左右的位数,不算什么。