前言

基数排序是一种非比较性排序算法,它通过将待排序的数据拆分成多个数字位进行排序。

实现原理

  1. 首先找出待排序数组中的最大值,并确定排序的位数。
  2. 从最低位(个位)开始,按照个位数的大小进行桶排序,将元素放入对应的桶中。
  3. 将各个桶中的元素按照存放顺序依次取出,组成新的数组。
  4. 接着按照十位数进行桶排序,再次将元素放入对应的桶中。
  5. 再次将各个桶中的元素按照存放顺序依次取出,组成新的数组。
  6. 重复上述操作,以百位、千位、万位等位数为基准进行排序,直至所有位数都被排序。

代码实现

        public static void RadixSort(int[] array)
        {
            if (array == null || array.Length < 2)
            {
                return;
            }

            //获取数组中的最大值,确定排序的位数
            int max = GetMaxValue(array);

            //进行基数排序
            for (int exp = 1; max / exp > 0; exp *= 10)
            {
                CountingSort(array, exp);
            }
        }

        private static void CountingSort(int[] array, int exp)
        {
            int arrayLength = array.Length;
            int[] output = new int[arrayLength];
            int[] count = new int[10];

            //统计每个桶中的元素个数
            for (int i = 0; i < arrayLength; i++)
            {
                count[(array[i] / exp) % 10]++;
            }

            //计算每个桶中最后一个元素的位置
            for (int i = 1; i < 10; i++)
            {
                count[i] += count[i - 1];
            }

            //从原数组中取出元素,放入到输出数组中
            for (int i = arrayLength - 1; i >= 0; i--)
            {
                output[count[(array[i] / exp) % 10] - 1] = array[i];
                count[(array[i] / exp) % 10]--;
            }

            //将输出数组复制回原数组
            for (int i = 0; i < arrayLength; i++)
            {
                array[i] = output[i];
            }
        }

        private static int GetMaxValue(int[] arr)
        {
            int max = arr[0];
            for (int i = 1; i < arr.Length; i++)
            {
                if (arr[i] > max)
                {
                    max = arr[i];
                }
            }
            return max;
        }

        public static void RadixSortRun()
        {
            int[] array = { 19, 27, 46, 48, 99, 888, 50, 2, 4, 44, 47, 36, 38, 15, 26, 5, 3 };

            Console.WriteLine("排序前数组:" + string.Join(", ", array));

            RadixSort(array);

            Console.WriteLine("排序后数组:" + string.Join(", ", array));
        }

运行结果

总结

基数排序是一种稳定的排序算法,它的时间复杂度为O(d*(n+r)),其中d是位数,n是元素个数,r是基数(桶的个数)。相比其他比较性排序算法,基数排序的优势在于减少了元素之间的比较次数,并且可以处理负数。但是,基数排序的缺点是需要额外的空间来存储临时数组。

C#基数排序算法的更多相关文章

  1. python --- 基数排序算法

    基数排序的方式可以采用LSD,由键值的最右边开始,适用于数值整数.或者MSD,由键值的最左边开始,适用于字符串整数.在LSD基数排序中每一次的处理都是将关键字按顺序放置在其各自的称为桶的数据结构中,而 ...

  2. 基数排序算法-python实现

    #-*- coding: UTF-8 -*- import numpy as np def RadixSort(a): i = 0 #初始为个位排序 n = 1 #最小的位数置为1(包含0) max ...

  3. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  4. 算法-java代码实现基数排序

    基数排序 第11节 基数排序练习题 对于一个int数组,请编写一个基数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素均小于等于2000. 测试样例: [1 ...

  5. 数据结构与算法——基数排序简单Java实现

    基数排序(radix sort)又称“桶子法”,在对多个正整数进行排序时可以使用.它的灵感来自于队列(Queue),它最独特的地方在于利用了数字的有穷性(阿拉伯数字只有0到9的10个). 基数排序使用 ...

  6. 基本排序算法的Python实现

    本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性 ...

  7. 基数排序 java 实现

    基数排序 java 实现 Wikipedia: Radix sort geeksforgeeks: Radix sort 数学之美番外篇:快排为什么那样快 Java排序算法总结(八):基数排序 排序八 ...

  8. 部分博文目录索引(C语言+算法)

    今天将本博客的部分文章建立一个索引,方便大家进行阅读,当然每一类别中的文章都会持续的添加和更新(PS:博文主要使用C语言) 博客地址:http://www.cnblogs.com/archimedes ...

  9. 数据结构与算法(1)----->排序

    这一版块,把必备的数据结构和算法做一个总结!包括排序.队列.链表.二叉树.排组合,动态规划....... 总结的过程包括理论部分,练题目可以自己去leetcode/牛客网刷起来- 第一篇文章讲排序- ...

  10. 八大排序算法Java实现

    本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...

随机推荐

  1. Istio 入门(三):体验 Istio、微服务部署、可观测性

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 3,快速入门 书店微服务 预先准备 details 应用 ratings 应用 reviews v1/v2/v3 ...

  2. 【Shell】字符串

    单引号和双引号 shell 字符串可以用单引号 '',也可以用双引号 "",也可以不用引号. 单引号的特点 单引号里不识别变量 单引号里不能出现单独的单引号(使用转义符也不行),但 ...

  3. 【SpringBoot】定时任务

    SpringBoot实现定时任务 SpringBoot创建定时任务,目前主要有以下三种实现方式: 基于注解(@Scheduled): 基于注解@Scheduled默认为单线程,开启多个任务时,任务的执 ...

  4. 加速LakeHouse ACID Upsert的新写时复制方案

    概述 随着存储表格式 Apache Hudi.Apache Iceberg 和 Delta Lake 的发展,越来越多的公司正在这些格式的基础上构建其 Lakehouse,以用于许多用例,例如增量摄取 ...

  5. 最为常用的Laravel操作(2)-路由

    基本路由 // 接收一个 URI 和一个闭包 Route::get('hello', function () { return 'Hello, Laravel'; }); // 支持的路由方法 Rou ...

  6. 2023ccpc大学生程序设计竞赛-zx

    这次ccpc整体来说做题做的比较卡,第一个签到都wa了,后面几道中档题全都是至少wa一次才能过,这导致我们不仅罚时增加也导致需要大量时间修改代码,还有一个G题很可惜,当时只注意到B过题多所以有点被带歪 ...

  7. 2021-7-6 new tcpip

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne ...

  8. Python sorted() 函数和sort()函数对比分析

    Python sorted() 函数 一.概述 sorted()函数是对所有可迭代的对象进行排序操作. sort与sorted的区别: sort是应用在list上的方法,sorted可以对所有可迭代的 ...

  9. django执行makemigrations报AttributeError: 'str' object has no attribute 'decode'

    顺着报错文件点进去,找到query = query.decode(errors='replace')将decode修改为encode即可.

  10. 【算法】用c#实现德州扑克卡牌游戏规则

    德州扑克是一种牌类游戏,可多人参与,它的玩法是,玩家每人发两张底牌,桌面依次发5张公共牌,玩家用自己的两张底牌和5张公共牌自由组合,按大小决定胜负. 使用c#完成功能Hand()以返回手牌类型和按重要 ...