• 基数排序算法的Java实现


    1、基数排序算法的简单介绍

    关于基数排序算法的介绍有很多资料可以通过很多途径获取。基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。

    基数排序算法:

    • 是一种非比较方法实现的排序算法
    • 基数排序算法是一种稳定的排序算法
    • 基数排序算法的时间复杂度: 分配需要O(n),收集为O(r),其中r为分配后链表的个数,以r=10为例,则有0~9这样10个链表来将原来的序列分类。而d,也就是位数(如最大的数是1234,位数是4,则d=4),即"分配-收集"的趟数。因此时间复杂度为O(d*(n+r))。
    • 基数排序算法的空间复杂度:需要额外的辅助空间,在基数排序过程中,对于任何位数上的基数进行“装桶”操作时,都需要n+r个临时空间

    2、基数排序算法的基础知识

        基数排序算法是针对每一位进行排序的,所以我们需要对给定的数据准确求出它的每一位数字是多少:

    1 //此函数返回整型数i的第k位是什么
    2     public static int getFigure(int i, int k) {
    3         int[] a = {1, 10, 100, 1000, 10000, 100000};
    4         return (i / a[k - 1]) % 10;
    5     }

    3、基数排序算法的算法思路

    • 设置int[] count 用来存放数组中每一位相同元素的个数值是多少
    • 设置int[] bucket当作桶,用来存取数组,所有桶的个数必须是和数组的长度保持一致
    • 当前数组中元素的最大位数为循环的次数,每次循环都是进行相同的操作
    • 先求出每一个数组元素中当前需要比较的位数值为多少,使用循环来统计在当前比较位的情况下每个桶中数据的数量
    • 利用count[i]来确定放置数据的位置,因为count[i]中存放的是在进行某一位排序的时候,数组中该位为i的所有数的个数,执行完此循环之后的count[i]就是第i个桶最右边界的位置
    • 利用循环把数组中一个个的数据装入各个桶中,注意是从后往前装
    • 将桶中的数据全部取出来,逐一重新赋值给arr
    • 循环重复执行上边的步骤,直到最后求出最终结果。

    4、基数排序算法的Java实现

     1 package com.baozi.com.test.paixu;
     2 
     3 import java.util.Arrays;
     4 
     5 /**
     6  * @author BaoZi
     7  * @create 2019-05-27-11:24
     8  */
     9 public class BitNumberSort {
    10     public static void main(String[] args) {
    11         //定义整型数组
    12         int[] nums = new int[]{21, 56, 88, 195, 354, 1, 35, 12, 6, 7, 4567, 87, 980, 12345};
    13         int[] nums1 = new int[]{1,23,345,21,432,324,4563,56789,6543,233};
    14         BitNumberSort.lsd_RadixSort(nums1, 5);
    15         System.out.println(Arrays.toString(nums1));
    16     }
    17 
    18     public static void lsd_RadixSort(int[] nums, int max) {
    19         int[] count = new int[10];
    20         int[] bucket = new int[nums.length];
    21         for (int i = 1; i <= max; i++) {
    22 
    23             for (int k = 0; k < count.length; k++) {
    24                 count[k] = 0;
    25             }
    26 
    27             for (int k = 0; k < nums.length; k++) {
    28                 count[getFigure(nums[k], i)]++;
    29             }
    30 
    31             for (int k = 1; k < 10; k++) {
    32                 count[k] = count[k] + count[k - 1];
    33             }
    34 
    35             for (int k = nums.length - 1; k >= 0; k--) {
    36                 int index = getFigure(nums[k], i);
    37                 bucket[count[index] - 1] = nums[k];
    38                 count[index]--;
    39             }
    40             for (int k = 0, j = 0; k < nums.length; k++, j++) {
    41                 nums[k] = bucket[j];
    42             }
    43         }
    44     }
    45 
    46     private static int getFigure(int i, int j) {
    47         int[] a = new int[]{1, 10, 100, 1000, 10000, 100000};
    48         return (i / a[j - 1]) % 10;
    49     }
    50 }
  • 相关阅读:
    HTTP状态码
    ADB server didn't ACK
    Android 手机震动
    Android 控制闪光灯
    UINavigationItem 设置UIBarButtonItem
    PhotoShop
    在指定时间调用某方法
    被忽视的TWaver功能(1)
    TWaver MONO Design中动画的导出与播放
    TWaver GIS在电信中的使用
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/10929948.html
Copyright © 2020-2023  润新知