JAVA基数排序

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为最大数据位数。所以基数排序还会因为数据的大小影响效率,但是影响不会太大,相对与上万个数据,十位左右的位数,不算什么。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值