基数排序

package com.fine.sort;

import java.util.Arrays;

/**
 * 基数排序 (桶排序)(一共十个桶,代表数字0~9)二维数组作为桶    一位数组记录每个桶中的元素个数
 *1 将数字按照个位 十位 百位等的数字放到各自的桶中
 *2 将桶中的数字按照从小到大的顺序放回到自己的数组中
 *3 进行下一位的循环
 * @author Fine
 *
 */
public class RadixSort {
	public static void main(String[] args) {
		int[] arr = {92,6,52,348,15,67};
		radixSort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void radixSort(int[] arr) {
		//1  计算出一共需要循环多少次(最大数的位数次)
		int max = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (arr[i]>max) {
				max = arr[i];
			}
		}
		//求出需要循环的次数
		int maxLoopCount = (max+"").length();
		//2  创建相应个数的桶(二维数组)第一位表示这个桶属于哪个位数,第二位是这个桶中存储的数据
		int[][] bucket = new int[10][arr.length];
		//  这个数组用来表示每个桶中元素的个数    如elementCountOfBucket[0]=1  表明 1这个桶中有1个元素
		int[] elementCountOfBucket = new int[10];
		//循环算出每一个数字位数,放到对应的桶中,然后依次取出放回到数组中去
		for (int x = 0,n=1; x < maxLoopCount; x++,n*=10) {
			//3 计算出每一个元素的个位的数字,放到对应的桶中
			for (int i = 0; i < arr.length; i++) {
				int digit = arr[i]/n%10;//求出这个元素个位的数字
				bucket[digit][elementCountOfBucket[digit]]=arr[i];//将这个元素放到指定桶的指定位置中去
				elementCountOfBucket[digit]++;//将这个桶对应的元素个数加1
			}
			//4 《依次》从桶中取出元素放回原数组中
			int index=0;//作为原数组的索引
			for (int i = 0; i < 10; i++) {
				//只有这个桶中有元素才会取元素
				if (elementCountOfBucket[i]!=0) {
					//循环这个桶,取出元素放到原来的数组中
					for (int j = 0; j < elementCountOfBucket[i]; j++) {
						arr[index]=bucket[i][j];
						index++;
					}
				}
				elementCountOfBucket[i]=0;//将取完的桶的元素个数置为0!!!否则下次重新取值会出现错误
			}
			
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值