算法4-索引排序算法
学习算法4,字符串篇中索引排序算法的练习实现
package com.gitee.xcfyl.sort;
import java.util.Arrays;
public class IndexSort {
/**
* 实现索引排序法
*
* @param args 参数
*/
public static void main(String[] args) {
int[] nums = new int[]{111111, 6666, 444, 333, 555};
sort(nums);
System.out.println(Arrays.toString(nums));
}
/**
* 实现索引排序算法
*
* @param nums 待升序排序的整型数组
*/
private static void sort(int[] nums) {
// 统计nums数组中最长的那个数字的长度,这个长度决定了外层循环
// 迭代的次数
int len = maxLen(nums);
// 外层循环i,表示当前要根据nums数组中所有数字的第i位进行排序
for (int i = 0; i < len; i++) {
// 这里count的角色是频率数组
int[] count = new int[11];
// count[i]存放的是,数字i-1出现的频率
for (int n : nums) {
int posN = getPosNum(n, i);
count[posN + 1]++;
}
// 将count转换为前缀和数组
for (int j = 0; j < 10; j++) {
count[j + 1] += count[j];
}
// 根据count的值对nums数组进行排序
int[] tmp = new int[nums.length];
for (int j = 0; j < tmp.length; j++) {
tmp[count[getPosNum(nums[j], i)]++] = nums[j];
}
// 回写
System.arraycopy(tmp, 0, nums, 0, nums.length);
}
}
/**
* @param num 整型数
* @param pos 假设num=234,那么pos可以是0,1,2,其中pos
* 为0的时候,表示num的第0位的数字,这里是4
* @return 返回num第pos个位置上面的数字
*/
private static int getPosNum(int num, int pos) {
while (num > 0 && pos > 0) {
num /= 10;
pos--;
}
return num % 10;
}
/**
* @param nums 整型数组
* @return 返回nums中所有整型数字的最长的那个数字的长度
*/
private static int maxLen(int[] nums) {
int max = lenOfNum(nums[0]);
for (int i = 1; i < nums.length; i++) {
int len = lenOfNum(nums[i]);
if (len > max) {
max = len;
}
}
return max;
}
/**
* @param num 整型数字
* @return 返回整数的位长,比如234的位长是3
*/
private static int lenOfNum(int num) {
int len = 0;
while (num > 0) {
num /= 10;
len++;
}
return len;
}
}