0
点赞
收藏
分享

微信扫一扫

Java实现基数排序,两种思路


◼ 基数排序非常适合用于整数排序(尤其是非负整数),因此本博客只演示对非负整数进行基数排序
◼ 执行流程:依次对个位数、十位数、百位数、千位数、万位数…进行排序,直到最大元素的最大基数(从低位到高位)

Java实现基数排序,两种思路_java

代码实现(含有详细注释)

package com.mj.sort;

public class RadixSort extends Sort<Integer> {

@Override
protected void sort() {
// 找出最大值
int max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}

// 个位数: array[i] / 1 % 10 = 3
// 十位数:array[i] / 10 % 10 = 9
// 百位数:array[i] / 100 % 10 = 5
// 千位数:array[i] / 1000 % 10 = ...

for (int divider = 1; divider <= max; divider *= 10) {
countingSort(divider); //从个位开始,按照个位大小对原数组进行排序,相当于计数排序对自定义对象数组进行排序
}
}

protected void countingSort(int divider) {
// 开辟内存空间,存储次数
int[] counts = new int[10];
// 统计每个整数出现的次数
for (int i = 0; i < array.length; i++) {
counts[array[i] / divider % 10]++;
}
// 累加次数
for (int i = 1; i < counts.length; i++) {
counts[i] += counts[i - 1];
}

// 从后往前遍历元素,将它放到有序数组中的合适位置
int[] newArray = new int[array.length];
for (int i = array.length - 1; i >= 0; i--) {
newArray[--counts[array[i] / divider % 10]] = array[i];
}

// 将有序数组赋值到array
for (int i = 0; i < newArray.length; i++) {
array[i] = newArray[i];
}
}
}

另一种思路:
1.创建一个二维数组,作为桶数组int[][] buckets = new int[10][array.length],即列数为10,每一列最多存储原数组长度的元素。

2.外层循环控制基数,内层先是遍历array,按照当前循环的基数,将array[i]放到桶的对应位置,比如当前基数是10,而array[i]为89,且他是array数组中第一个十位数为8的数,则将89放到buckets[8][0]位置,依此类推。

3.内层第二个循环是遍历桶数组buckets,将buckets[i]列存储的所有元素逐个加到array数组中,其中bucketsSizes数组已经记录了桶数组中每一列有多少元素。所以内层循环边界条件就是bucketsSize[i]

Java实现基数排序,两种思路_数组_02


Java实现基数排序,两种思路_排序算法_03


举报

相关推荐

0 条评论