package com.zuoshen.jichurumen.class03;
/**
* @author ShiZhe
* @create 2022-02-25 11:11
*/
public class code01 {
/**
* 计数排序
* 当输入的元素是n个0到k之间的整数时,它的运行时间是Θ(n+k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。
* 一般适用于值在0-200之间的数组排序
* @param arr
*/
public static void countSort(int[] arr) {
if(arr == null || arr.length < 2) {
return;
}
int max = Integer.MIN_VALUE;
// 获取待排序数组的最大值
for (int i = 0; i < arr.length; i++) {
max = Math.max(max, arr[i]);
}
// 建立辅助数组
int[] bucket = new int[max + 1];
// 将待排序数组按照数值填充进辅助数组
for (int j = 0; j < arr.length; j++) {
bucket[arr[j]]++;
}
int i = 0;
for (int j = 0; j <bucket.length; j++) {
while (bucket[j]-- > 0) {
arr[i++] = j;
}
}
}
/**
* 基数排序
* 将整数按位数切割成不同的数字,然后按每个位数分别比较。
* @param arr
*/
public static void radixSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
// 获取待排序数组的最大值
int max = Integer.MIN_VALUE;
for (int i = 0; i <arr.length; i++) {
max = Math.max(max, arr[i]);
}
// 获取待排序数组最大值的位数
int digit = 0;
while (max != 0) {
max /= 10;
digit++;
}
// 规定基数为10,0-9
final int radix = 10;
// 新建辅助数组
int[] bucket = new int[arr.length + 1];
int i = 0, j = 0;
// 循环次数为位数大小
for (int d = 1; d <= digit; d++) {
// 新建对应基数的数组
int[] count = new int[radix];
// 得到对应的基数数组中符合该基数的大小
for (i = 0; i < arr.length; i++) {
j = getDigit(arr[i], d);
count[j]++;
}
// 将基数数组相邻相加,得到按照基数排列下标个数,从下标为1开始相加
// 例如:个位为1的有2个,个位为2的有3个,相加后,基数数组为[2.5],表明0-1是个位为1,0-4是个位为1-2。
for (i = 1; i < count.length; i++) {
count[i] = count[i - 1] + count[i];
}
// 倒序遍历待排序数组,为了保持排序的稳定性
for (i = arr.length -1 ; i >= 0; i--) {
j = getDigit(arr[i], d);
bucket[count[j] - 1] = arr[i];
count[j]--;
}
// 复制给arr
for (i = 0; i < arr.length ;i++) {
arr[i] = bucket[i];
}
}
}
/**
* 获得数据中的某一位
* @param x
* @param d
* @return
*/
public static int getDigit(int x, int d) {
// Math.pow(a,b)表示a的b次方幂,Math.pow(2,3)则为2的3次方等于8
return ((x / ((int) Math.pow(10, d - 1))) % 10);
}
public static void main(String[] args) {
// 计数排序
int[] arr1 = {45, 4563, 14512, 222, 225, 24, 215, 45, 56315, 4534};
countSort(arr1);
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
// 基数排序
int[] arr2 = {45, 4563, 14512, 222, 225, 24, 215, 45, 56315, 4534};
radixSort(arr2);
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}