当前位置: 首页 > news >正文

基数排序

/*
      * 获取数组a中最大值
      *
      * 参数说明:
      *     a -- 数组
      *     n -- 数组长度
      */
        private int GetMax(int[] a)
        {
            int max;

            max = a[0];
            for (int i = 1; i < a.Length; i++)
                if (a[i] > max)
                    max = a[i];

            return max;
        }

        /*
         * 对数组按照"某个位数"进行排序(桶排序)
         *
         * 参数说明:
         *     a -- 数组
         *     exp -- 指数。对数组a按照该指数进行排序。
         *
         * 例如,对于数组a={50, 3, 542, 745, 2014, 154, 63, 616};
         *    (01) 当exp=1表示按照"个位"对数组a进行排序
         *    (02) 当exp=10表示按照"十位"对数组a进行排序
         *    (03) 当exp=100表示按照"百位"对数组a进行排序
         *    ...
         */
        private void CountSort(int[] a, int exp)
        {
            //int output[a.length];    // 存储"被排序数据"的临时数组
            int[] output = new int[a.Length];    // 存储"被排序数据"的临时数组
            int[] buckets = new int[10];

            // 将数据出现的次数存储在buckets[]中
            for (int i = 0; i < a.Length; i++)
                buckets[(a[i] / exp) % 10]++;

            // 更改buckets[i]。目的是让更改后的buckets[i]的值,是该数据在output[]中的位置。
            for (int i = 1; i < 10; i++)
                buckets[i] += buckets[i - 1];

            // 将数据存储到临时数组output[]中
            for (int i = a.Length - 1; i >= 0; i--)
            {
                output[buckets[(a[i] / exp) % 10] - 1] = a[i];
                buckets[(a[i] / exp) % 10]--;
            }

            // 将排序好的数据赋值给a[]
            for (int i = 0; i < a.Length; i++)
                a[i] = output[i];

            output = null;
            buckets = null;
        }

        /*
         * 基数排序
         *
         * 参数说明:
         *     a -- 数组
         */
        public void RadixSort(int[] a)
        {
            int exp;    // 指数。当对数组按各位进行排序时,exp=1;按十位进行排序时,exp=10;...
            int max = GetMax(a);    // 数组a中的最大值

            // 从个位开始,对数组a按"指数"进行排序
            for (exp = 1; max / exp > 0; exp *= 10)
                CountSort(a, exp);
        }

 

转载于:https://www.cnblogs.com/asenyang/p/6936402.html

相关文章:

  • PHP array_walk() 函数
  • D、GO、Rust 谁会在未来取代 C?为什么?
  • Python基础—函数(Day9)
  • 移动开发平台 Flutter
  • Android事件分发机制详解
  • Python基础—文件操作(Day8)
  • 用编程来玩的游戏 CodeCombat 已全面开源
  • 下载编译 Android wear 源代码,尝试制作可穿戴设备功能
  • Python基础-字符串实例2
  • oracle经典书籍推荐
  • Android高仿糗事百科(含服务端)
  • MongoDB 被攻击风波未平,如何避免黑客入侵?
  • kubernetes监控:grafana plugins IN kubernetes
  • 使用Mybatis-Generator自己主动生成Dao、Model、Mapping相关文件
  • Python 学习(二)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Django 博客开发教程 16 - 统计文章阅读量
  • Flex布局到底解决了什么问题
  • Git初体验
  • Golang-长连接-状态推送
  • Javascript 原型链
  • java小心机(3)| 浅析finalize()
  • java中具有继承关系的类及其对象初始化顺序
  • PAT A1120
  • PHP面试之三:MySQL数据库
  • Python利用正则抓取网页内容保存到本地
  • React系列之 Redux 架构模式
  • Redux 中间件分析
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 给Prometheus造假数据的方法
  • 基于HAProxy的高性能缓存服务器nuster
  • 容器服务kubernetes弹性伸缩高级用法
  • 收藏好这篇,别再只说“数据劫持”了
  • 双管齐下,VMware的容器新战略
  • 系统认识JavaScript正则表达式
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 异步
  • ​MySQL主从复制一致性检测
  • # C++之functional库用法整理
  • #includecmath
  • $.proxy和$.extend
  • (2)Java 简介
  • (3)选择元素——(17)练习(Exercises)
  • (二)fiber的基本认识
  • (二)WCF的Binding模型
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (九)c52学习之旅-定时器
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)基于IDEA的JAVA基础1
  • (原)Matlab的svmtrain和svmclassify
  • ***详解账号泄露:全球约1亿用户已泄露
  • .Net6使用WebSocket与前端进行通信