首页 > 编程语言 >排序算法-基数排序

排序算法-基数排序

时间:2023-04-18 17:47:01浏览次数:38  
标签:Sort 10 nums int 元素 算法 基数排序 排序

基数排序Radix Sort

基数排序.gif

1. Radix Sort介绍

Radix Sort属于“分配式排序”(Distribution Sort),又称“桶子法”(Bucket Sort),其是通过比较待排序序列的所有元素的各个位的值,将元素分配至“桶”中,以达到排序的目的。Radix Sort是一种效率较高且稳定的排序算法,其是桶排序的扩展

Radix Sort的基本思想是:将待排序序列中所有数值统一为同样的数位长度,数位较短的在前面补零。然后从最低位开始依次将其放入对应的“桶”中,然后按序取出放回原数组,并进行下一轮针对下一个数位的同样操作。这样从最低位一直到最高位排序完成后,就得到了一个有序序列。

注意:Radix Sort是典型的空间换时间的方法,占用内存很大,当面对海量数据排序时,容易造成OutOfMemoryError

2. 图解说明Radix Sort的步骤

举一个例子来具体说明Radix Sort的过程。给出一个无序数列:23,1,4,9,98,132,42使用基数排序将其排列成一个从小到大的有序数列。

基数排序示例step1.png
  1. 确定待排序序列中最大的元素有几位,即确定Radix Sort执行的轮数rounds
  2. 定义10个“桶”(0-9),可以用二维数组bucket [10] [nums.length]来表示。取每一个元素的个位的值(nums[i] / 1 % 10),并将元素分别装入对应下标的桶中。同时定义一个一维数组bucketElementCounts [10]用于记录每个桶中实际放入元素的个数
基数排序示例step2.png
  1. 将桶中的元素按下标顺序依次取出,放入到原来的序列中,每取完一个桶中的元素,就将该桶对应的bucketElementCounts置为0便于下一次重新开始计数
  2. 执行下一轮针对十位数字的操作,取每一个元素的十位的值(nums[i] / 10 % 10),分别装入对应下标的桶中;
基数排序示例step3.png
  1. 重复上面的步骤直至达到rounds轮结束,此时序列排序完成。

3. 代码实现

package com.algorithm;

import java.util.Arrays;

/**
 * @author SnkrGao
 * @create 2023-04-18 15:52
 */
public class RadixSort {
    public static void main(String[] args) {
        int[] nums = {23,1,4,9,98,132,42};
        System.out.println("排序前的数组为:");
        System.out.println(Arrays.toString(nums));
        System.out.println("---------------------------------");

        radixSort(nums);

        System.out.println("---------------------------------");
        System.out.println("排序后的数组为:");
        System.out.println(Arrays.toString(nums));
    }

    public static void radixSort(int[] nums) {
        int rounds = getRounds(nums); // 执行轮数
        int bucket[][] = new int[10][nums.length]; // 定义二维数组表示十个桶
        int bucketElementCounts[] = new int[10]; // 定义一个一维数组表示每个桶中实际放入的元素个数

        // 最外层循环i表示排序的轮次,n用于取出元素的个位/十位/百位,每一轮结束后n *= 10
        for (int i = 0, n = 1; i < rounds; i++, n *= 10) {
            // 遍历每一个元素
            for (int j = 0; j < nums.length; j++) {
                // 计算元素的某个数位的值(n=1为个位,n=10为十位,n=100为百位)
                int digitOfElement = nums[j] / n % 10;
                // 将元素放入对应的桶中,每放一个元素该桶的元素计数 + 1,初始时每个桶的bucketElementCounts均为0
                bucket[digitOfElement][bucketElementCounts[digitOfElement]] = nums[j];
                bucketElementCounts[digitOfElement]++;
            }

            // 表示从桶中取出的元素放入原nums的位置
            int index = 0;
            // 遍历每一个桶
            for (int j = 0; j < bucket.length; j++) {
                // 从桶中按下标顺序依次取出元素
                for (int k = 0; k < bucketElementCounts[j]; k++) {
                    // 将元素放入原nums数组中
                    nums[index++] = bucket[j][k];
                }
                // 注意:每取完一个桶都将该桶存放的元素个数置零,以便下一轮放入桶中时重新计数
                bucketElementCounts[j] = 0;
            }

            System.out.println("第" + (i + 1) + "轮的排序结果为:");
            System.out.println(Arrays.toString(nums));
        }

    }

    // 计算nums中最大元素的位数,即排序执行的轮数
    public static int getRounds(int[] nums) {
        int max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > max) {
                max = nums[i];
            }
        }
        return (max + "").length();
    }
}

标签:Sort,10,nums,int,元素,算法,基数排序,排序
From: https://www.cnblogs.com/SnkrGao/p/17330467.html

相关文章

  • 初次排序算法学习
    直接选择排序:思路:从数组中挑出最小(最大)的数,与数组第一位(最后一位)交换位置,然后依次进行,直到最后两个元素比较完毕为止。实现:声明一个中间变量max,用于存放最大值;声明一个变量m,用于存放最大值对应的序号。外侧循环次数是n-1,n是数组元素个数,意思是挑出n-1个最大值,剩下的自然是最......
  • 基于GOA蚱蜢优化算法的KNN分类器最优特征选择matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要蝗虫优化算法(GrasshopperOptimizationAlgorithm,GOA)是一种新型的元启发式算法,由Mirjalili等人于2017年提出。该算法受幼虫和成年蝗虫大范围移动与寻找食物源的聚集行为启发,具有操作参数少,公式简单......
  • 基于决策树算法的病例类型诊断matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要ID3算法是一种贪心算法,用来构造决策树。ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成......
  • 串的模式匹配(BF算法)
    【问题描述】串的模式匹配算法BF的实现与应用。【输入形式】第一行输入主串s;第二行输入模式串t;输入串中均不包含空格字符。【输出形式】模式串在主串s中的出现的每一个位置序号。若一次都未匹配到,则输出0。【样例输入1】ababcabcacbabab【样例输出1】13612【样例输入2】11111345......
  • 基于GOA蚱蜢优化算法的KNN分类器最优特征选择matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       蝗虫优化算法(GrasshopperOptimizationAlgorithm,GOA)是一种新型的元启发式算法,由Mirjalili等人于2017年提出。该算法受幼虫和成年蝗虫大范围移动与寻找食物源的聚......
  • 实际问题中用到的算法——递归算法确定插帧顺序
    问题:现在需要给一个视频序列插帧,插帧算法要求每次只能由两帧输入插值得到其中间帧。如果现在需要给一个视频做4倍(或者更高的8,16倍等类似)的插帧,则一个插帧的思路是当前视频每相邻帧之间插入3帧,即:假设插帧前视频帧序号是0,4,8,12…,则插帧时补充相邻帧跨过的3个序号,得到插......
  • 大数据的快速崛起,离不开数据、区块链和算法的支持
    事实上,自2001年来,大数据已然呈现出爆炸式增长。经过多年发展,大数据的应用已经帮助我们开发了更多、更高端的技术在我们的工作、生活中。与此同时,大数据也衍生出了其他技术,比如人工智能、机器学习等。那么,放眼未来,大数据又将如何开启新征程?1.通过数据,更好赋权这个意思就是我们应该给......
  • 26、字符串匹配 KMP 算法
    1、KMP算法的基本原理2、KMP算法的正确性证明3、什么是LPS数组4、LSP数组的计算5、实现LPS数组6、KMP算法的实现7、复杂度分析......
  • 【LeetCode剑指offer 03】合并两个/K个排序链表
    合并两个排序链表https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4,1->3->4输出:1->1->2->3->4->4限制:0<=链表长度<=1000思路代码classSolutio......
  • 密码引擎-4-国䀄算法交叉测试
    实验一密码引擎-4-国䀄算法交叉测试02人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码和运行结果截图2在Ubuntu中基于OpenSSL产生一对公私钥对(SM2算法)在安装了正确版本的openss......