• Java排序算法之基数排序


    基数排序(Radix Sort)是一种线性时间复杂度的排序算法,其时间复杂度为O(d(n+k)),其中d是数字的位数,k是进制数。基数排序是一种非比较排序算法,它按照数位的大小来进行排序。它可以处理正整数、负整数和小数。

    基数排序的实现过程如下:

    1. 找到最大数,并确定最大数的位数。

    2. 从个位数开始,把所有数按照该位数进行排序。可以使用计数排序或桶排序。排序后,原数组变成了按照该位数排序后的数组。

    3. 重复第二步,直到最大数的最高位被处理完。

    举个例子:

    假设有以下六个数字要排序:23,46,12,67,34,89。我们先找到最大数89,确定最大数的位数为2。

    第一轮排序按照个位数排序:

    个位数桶1桶2桶3桶4桶5桶6桶7桶8桶9
    32334466789
    212
    6

    第二轮排序按照十位数排序:

    十位数桶1桶2桶3桶4桶5桶6桶7桶8桶9
    31223344667
    889

    最终排序结果为:12,23,34,46,67,89。

    Java实现基数排序的核心思想是:将数字按照每个位数分别排序,从低位到高位依次进行排序,最后得到有序序列。

    下面是Java实现基数排序的代码:

    1. public class RadixSort {
    2. /**
    3. * 基数排序
    4. * @param arr 待排序数组
    5. */
    6. public static void radixSort(int[] arr) {
    7. if (arr == null || arr.length == 0) return;
    8. int max = arr[0];
    9. for (int i = 1; i < arr.length; i++) {
    10. if (arr[i] > max) max = arr[i]; // 找到最大值
    11. }
    12. int radix = 10; // 进制数,这里是10进制
    13. int exp = 1; // 指数
    14. int[] aux = new int[arr.length]; // 临时数组
    15. while (max / exp > 0) { // 从个位开始,对每一位进行排序
    16. int[] buckets = new int[radix];
    17. // 统计每个桶中的记录数
    18. for (int i = 0; i < arr.length; i++) {
    19. int bucketIndex = (arr[i] / exp) % radix;
    20. buckets[bucketIndex]++;
    21. }
    22. // 将各个桶中的数字个数,转化成各个桶中最后一个数字的索引位置
    23. for (int i = 1; i < radix; i++) {
    24. buckets[i] += buckets[i - 1];
    25. }
    26. // 将原数组中的元素放入临时数组中,根据桶中位置排序
    27. for (int i = arr.length - 1; i >= 0; i--) {
    28. int bucketIndex = (arr[i] / exp) % radix;
    29. aux[--buckets[bucketIndex]] = arr[i];
    30. }
    31. // 将有序的数组写回原数组
    32. for (int i = 0; i < arr.length; i++) {
    33. arr[i] = aux[i];
    34. }
    35. exp *= radix;
    36. }
    37. }
    38. public static void main(String[] args) {
    39. int[] arr = { 170, 45, 75, 90, 802, 24, 2, 66 };
    40. radixSort(arr);
    41. System.out.println(Arrays.toString(arr)); // [2, 24, 45, 66, 75, 90, 170, 802]
    42. }
    43. }

  • 相关阅读:
    第 2 章 线性表(静态链表示例)
    推荐几个制作svg的工具
    2-Java进阶知识总结-8-反射-动态代理
    恶意软件之系统病毒
    沙盘游戏培训感悟
    四、矩阵的分类
    k8s 安全机制详解
    HTML篇八——(1)
    391. 完美矩形 扫描线
    【Linux网络编程】服务端编程初体验
  • 原文地址:https://blog.csdn.net/m0_37649480/article/details/134413590