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!!!否则下次重新取值会出现错误
}
}
}
}
基数排序
最新推荐文章于 2023-04-13 11:24:26 发布