zoukankan      html  css  js  c++  java
  • 20、排序算法-基数排序

    来源:https://www.bilibili.com/video/BV1B4411H76f?p=60

    一、思路

    基数排序:属于分配式排序,将要排序的元素按照位(个十百)分配到“桶”中。

    例如:[53,3,542,748,14,214]从小到大

    统一 待比较数据的长度,高位补零。设置10个“桶”,按照0-9依次排列。

    第一趟(看个位):遍历数组填入数据

      0:没有

      1:没有

      2:542

      3:53, 3

      4:14, 214

      5:没有

      6:没有

      7:没有

      8:748

      9:没有

    按照桶内的位置依次取出[542,53,3,14,214,748]

    第二趟(看十位):  

      0:3

      1:14, 214

      2:没有

      3:没有

      4:542,748

      5:53

      6:没有

      7:没有

      8:没有

      9:没有

    按照桶内的位置依次取出[3,14,214,542,748,53]

    第三趟(看百位):  

      0:3,14, 53

      1:没有

      2:214

      3:没有

      4:没有

      5:542

      6:没有

      7:748

      8:没有

      9:没有

    按照桶内的位置依次取出[3,14,53,214,542,748]完成

    二、实现

     1 //基数排序
     2 public class RadixSort {
     3     public static void main(String[] args) {
     4         int[] arr = {53,3,542,748,14,214};
     5         System.out.println(Arrays.toString(arr));
     6 
     7         radixSort(arr);
     8         System.out.println(Arrays.toString(arr));
     9     }
    10 
    11     public static void radixSort(int[] arr){
    12         //统一数据长度
    13         int max = arr[0];
    14         for (int i = 0; i < arr.length; i++) {
    15             if(arr[i] > max){
    16                 max = arr[i];
    17             }
    18         }
    19         int maxLength = (max + "").length();
    20 
    21         //桶,0-9,每个桶最多装arr.length个数据
    22         int[][] bucket = new int[10][arr.length];
    23 
    24         //统计桶内的数据个数
    25         int[] bucketCounts = new int[10];
    26 
    27         //按照位来
    28         for (int i = 0,n=1; i < maxLength; i++,n *= 10) {
    29             //遍历数组
    30             for (int j = 0; j < arr.length; j++) {
    31                 //看当前位是几
    32                 int digit = arr[j] / n % 10;
    33                 bucket[digit][bucketCounts[digit]] = arr[j];
    34                 bucketCounts[digit]++;
    35             }
    36             //放完数据开始取
    37             int index = 0;
    38             for (int k = 0; k < bucketCounts.length; k++) {
    39                 if(bucketCounts[k] != 0){
    40                     //桶中有数据
    41                     for (int l = 0; l < bucketCounts[k]; l++) {
    42                         arr[index] = bucket[k][l];//第k个桶,第l个数据
    43                         index++;
    44                     }
    45                     bucketCounts[k] = 0;//清空桶
    46                 }
    47             }
    48         }
    49     }
    50 }

    结果

    [53, 3, 542, 748, 14, 214]
    [3, 14, 53, 214, 542, 748]
  • 相关阅读:
    javascript和jquery如何判断元素是否存在最佳。
    Sping中Bean配置的深入探讨
    Spring基于 Annotation 的简单介绍
    Sping中的配置Bean详解
    Sping框架概述
    Hibernate中的HQL语言
    Hibernate的检索策略和优化
    Hibernate表关系映射之多对多映射
    Hibernate表关系映射之一对多映射
    Hibernate表关系映射之一对一映射
  • 原文地址:https://www.cnblogs.com/zhao-xin/p/13164623.html
Copyright © 2011-2022 走看看