java 中的基数排序(桶排序)

基数排序(桶排序)

是一种稳定的(同样大小的相对位置保持不变),牺牲内存换速度的排序方法。

package com.mycode.bucketsort;

import java.text.SimpleDateFormat;
import java.util.Date;

//基数排序(桶排序)是一种牺牲内存换取速度的方法。
public class BucketSortTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = BucketSortTest.create(880000);
		
//		BucketSortTest.show(arr);
		
		Date date =new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
		String dateStr = simpleDateFormat.format(date);
		System.out.println("排序前的时间是:" + dateStr);
		
		BucketSortTest.bucketSort(arr);
		
		Date date2 =new Date();
		String dateStr2 = simpleDateFormat.format(date2);
		System.out.println("排序后的时间是:" + dateStr2);
//		BucketSortTest.show(arr);
		
	}
	//显示数组
		public static void show(int[] arr){
			for(int i = 0; i < arr.length; i++){
				System.out.print(arr[i] + " ");
			}
			System.out.println();
		}
	//生成一个随机数组
		public static int[] create(int n){
			int[] arr = new int[n];
			for(int i = 0; i < n; i++){
				arr[i] = (int)(Math.random() * 900000);
			}
			return arr;
		}
	public static void bucketSort(int[] arr){
		//创建一个二维数组,有10个桶,每个桶里能放多少个不确定,所以只能用最大容量arr.length,(牺牲内存)
		int[][] buckets = new int[10][arr.length];
		//创建一个一维数组,用来计算桶中各有几个数
		int[] bucketCount = new int[10];
		//找到数组中的最大值(数组值都大于0)
		int temp = arr[0];
		for(int i = 1; i < arr.length; i++){
			if(temp < arr[i]){
				temp = arr[i];
			}
		}
		//确定最大值的长度
		int times = (temp + "").length();
		
		for(int t = 0, n = 1; t < times; t++, n *= 10){
			//往桶里放值
			for(int i = 0; i < arr.length; i++){
				 temp = arr[i] / n % 10;
				 buckets[temp][bucketCount[temp]++] = arr[i];
			}
			//从桶中取数据
			int index = 0;
			for(int i = 0; i < bucketCount.length; i++){
				if(bucketCount[i] != 0){
					for(int j = 0; j < bucketCount[i]; j++){
						arr[index++] = buckets[i][j];
					}
				}
				bucketCount[i] = 0;
			}
		}	
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值