Day567.基数排序 -数据结构和算法Java

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day567.基数排序 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。

基数排序

一、介绍

二、基本思想

三、思路分析


四、代码实现

package com.achang.sort;

import java.util.Arrays;

/**
 * @Author Achang
 * @Date 2022/3/24 21:29
 * 基数排序
 **/
public class RadixSort 
    public static void main(String[] args) 
        int arr[] = 53,3,542,748,14,214;
        radixSort1(arr);
        System.out.println(Arrays.toString(arr));
    

    //基数排序最终代码
    public static void radixSort1(int[] arr)
        //得到数组中最大数的位数
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) 
            if (arr[i] > max)
                max = arr[i];
            
        
        int maxLength = String.valueOf(max).length();


        //定义二维数组,表示10个桶,每个桶表示一个一维数组
        int[][] bucket = new int[10][arr.length];
        //为了记录每个桶实际存放多少个数据,于是定义一个一维数组来记录各个桶每次放入数据的个数
        //例子:bucketElementCounts[0] ,表示bucket[0]桶每次放入数据的个数
        int[] bucketElementCounts = new int[10];

        for (int c = 0,n = 1; c < maxLength; c++,n *= 10) 
            for (int j = 0;j < arr.length;j++)
                //取出元素的个位值
                int digitOfElement  = (arr[j] / n) % 10;
                //放入到对应的桶中
                bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
                bucketElementCounts[digitOfElement]++;
            
            //按照这个桶的顺序(一维数组的下标依次取出数据,放到原来的数组)
            int index1 = 0;
            //遍历每一个桶
            for (int i = 0; i < bucket.length; i++) 
                //如果桶中有数据,才取出
                if (bucketElementCounts[i] != 0)
                    //循环该桶
                    for (int l = 0;l< bucketElementCounts[i]; l++)
                        //取出元素,放入到arr中
                        arr[index1++] = bucket[i][l];
                    
                
                //第一轮处理后,需要bucketElementCounts[i] = 0
                bucketElementCounts[i] = 0;
            
        


    

    //基数排序推导
    public static void radixSort2(int[] arr)
        //第一轮排序,针对每个元素的各位进行排序

        //定义二维数组,表示10个桶,每个桶表示一个一维数组
        int[][] bucket = new int[10][arr.length];

        //为了记录每个桶实际存放多少个数据,于是定义一个一维数组来记录各个桶每次放入数据的个数
        //例子:bucketElementCounts[0] ,表示bucket[0]桶每次放入数据的个数
        int[] bucketElementCounts = new int[10];

        //第一轮,针对每个元素的个位进行排序处理
        for (int j = 0;j < arr.length;j++)
            //取出元素的个位值
            int digitOfElement  = arr[j] / 1 % 10;
            //放入到对应的桶中
            bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
            bucketElementCounts[digitOfElement]++;
        
        //按照这个桶的顺序(一维数组的下标依次取出数据,放到原来的数组)
        int index1 = 0;
        //遍历每一个桶
        for (int i = 0; i < bucket.length; i++) 
            //如果桶中有数据,才取出
            if (bucketElementCounts[i] != 0)
                //循环该桶
                for (int l = 0;l< bucketElementCounts[i]; l++)
                    //取出元素,放入到arr中
                    arr[index1++] = bucket[i][l];
                
            
            //第一轮处理后,需要bucketElementCounts[i] = 0
            bucketElementCounts[i] = 0;
        


        //第二轮,针对每个元素的十位进行排序处理
        for (int j = 0;j < arr.length;j++)
            //取出元素的十位值
            int digitOfElement  = arr[j] / 10 % 10;
            //放入到对应的桶中
            bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
            bucketElementCounts[digitOfElement]++;
        
        //按照这个桶的顺序(一维数组的下标依次取出数据,放到原来的数组)
        index1 = 0;
        //遍历每一个桶
        for (int i = 0; i < bucket.length; i++) 
            //如果桶中有数据,才取出
            if (bucketElementCounts[i] != 0)
                //循环该桶
                for (int l = 0;l< bucketElementCounts[i]; l++)
                    //取出元素,放入到arr中
                    arr[index1++] = bucket[i][l];
                
            
            //第二轮处理后,需要bucketElementCounts[i] = 0
            bucketElementCounts[i] = 0;
        

        //第三轮,针对每个元素的百位进行排序处理
        for (int j = 0;j < arr.length;j++)
            //取出元素的百位值
            int digitOfElement  = arr[j] / 100 % 10;
            //放入到对应的桶中
            bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
            bucketElementCounts[digitOfElement]++;
        
        //按照这个桶的顺序(一维数组的下标依次取出数据,放到原来的数组)
        index1 = 0;
        //遍历每一个桶
        for (int i = 0; i < bucket.length; i++) 
            //如果桶中有数据,才取出
            if (bucketElementCounts[i] != 0)
                //循环该桶
                for (int l = 0;l< bucketElementCounts[i]; l++)
                    //取出元素,放入到arr中
                    arr[index1++] = bucket[i][l];
                
            
            //第三轮处理后,需要bucketElementCounts[i] = 0
            bucketElementCounts[i] = 0;
        

    


以上是关于Day567.基数排序 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

基数排序

最高有效位基数排序如何比最低有效位基数排序更有效?

我应该在基数排序中使用哪个基数?以及如何在基数之间转换?

基数排序是不是用于后缀排序?

基数排序就这么简单

基数排序就这么简单