题目

一个无序数组,使用基数排序的方式从小到大进行排序

解析

给定一个数组:

首先准备一个"桶"(每个桶是一个队列);

从左到右遍历数组,每个元素的个位数是多少,就进入几号桶中;

在从左到右遍历桶,桶内元素先进先出依次排列,得到了一个按个位数从小到大排序的数组;

这个数组从左到右遍历数组,每个元素的十位数是多少,就进入几号桶中,在遍历桶依次排列元素,按十位数从小到大排好序的数组;

在按照百位数重复操作,得到了最终排好序的数组;

代码

public static void radixSort(int[] arr) {if (arr == null || arr.length < 2) {return;}radixSort(arr, 0, arr.length - 1, maxbits(arr));
}private static int maxbits(int[] arr) {int max = Integer.MIN_VALUE;for (int i = 0; i < arr.length; i++) {max = Math.max(max, arr[i]);}int res = 0;while (max != 0) {res++;max /= 10;}return res;
}private static void radixSort(int[] arr, int L, int R, int digit) {final int radix = 10;int i = 0, j = 0;// 有多少个数准备多少个辅助空间int[] help = new int[R - L + 1];for (int d = 1; d <= digit; d++) { // 有多少位就进出几次// 10个空间// count[0] 当前位(d位)是0的数字有多少个// count[1] 当前位(d位)是(0和1)的数字有多少个// count[2] 当前位(d位)是(0、1和2)的数字有多少个// count[i] 当前位(d位)是(0~i)的数字有多少个int[] count = new int[radix]; // count[0..9]for (i = L; i <= R; i++) {// 103  1   3// 209  1   9j = getDigit(arr[i], d);count[j]++;}for (i = 1; i < radix; i++) {count[i] = count[i] + count[i - 1];}for (i = R; i >= L; i--) {j = getDigit(arr[i], d);help[count[j] - 1] = arr[i];count[j]--;}for (i = L, j = 0; i <= R; i++, j++) {arr[i] = help[j];}}
}private static int getDigit(int x, int d) {return ((x / ((int) Math.pow(10, d - 1))) % 10);
}

有苦有乐的算法 --- 基数排序相关推荐

  1. 有苦有乐的算法 --- 有序数组中的元素存在问题、最左元素问题和无序数组局部最小问题

    一个有序数组,判断是否含有一个元素 解析: 给定一个数组 如果需要判断是否存在的元素为3. 首先找到数组的中间元素: 如果此元素为3,结束: 如果不是,此元素与3比较,此元素如果大于3,在从此元素左边 ...

  2. 有苦有乐的算法 --- 一个数组中,有两种数出现了奇数次,其余数都出现了偶数次,找到这两种数

    题目 一个数组中,有两种数出现了奇数次,其余数都出现了偶数次,找到这两组数 例: [2,4,3,2,5,4] ⇒ [3,5] [1,4,6,3,7,8,3,2,1,2,6,6,7,8] ⇒ [6,4] ...

  3. 有苦有乐的算法 --- 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点

    题目 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点. 解析 第一步,判断链表是有环链表还是无环链表: 如果一个单链表无环,它一定有一个指向null的尾结点: 如 ...

  4. 有苦有乐的算法 --- 获取二叉树的最大宽度

    题目 一颗二叉树,求其最大宽度. 例: 解析 按层遍历二叉树: 在遍历时,使用用4个变量来记录信息: Node curEnd = null; // 当前层,最右节点是谁 Node nextEnd = ...

  5. 有苦有乐的算法 --- 随机快排

    题目 使用随机快排对给定数组进行从小到大排序 [5,3,2,1,5] ⇒ [1,2,3,5,5] 解析 给定一个数组 1.在数组中找出一个数作为基准(最右侧的数2):变量l记录数组头位置,变量r记录尾 ...

  6. 有苦有乐的算法 --- 小和问题

    题目 一个无序数组,获取每个元素在左面比这个元素小的个数,求这些个数的和 例: [3,2,5,1,4] ==> 6 [4,7,0,8,2,4,9,4] ==> 14 解析 准备一个无序数组 ...

  7. 有苦有乐的算法 --- 计数排序

    题目 一个数组,其数据范围在0~200之间,将其从小到大排序 解析 给定一个数组: 首先获取去最大值,然后创建一个长度为这个最大值+1的临时数组: 遍历原数组,如果原数组中的元素是n,在临时数组索引为 ...

  8. 有苦有乐的算法 --- 归并排序

    题目 对无序数组进行归并排序,使其有序 解析 准备一个无序数组, 将这个数组平均分成两部分,再把每一部分在平均分成两部分,以此类推,直到分成只剩一个数为止 在将每一部分排序后依次返回 代码 publi ...

  9. 有苦有乐的算法 --- 图的深度优先遍历

    题目 给定一个图,使用栈对其进行深度优先遍历 代码 public static void dfs(Node node) {if (node == null) {return;}Stack<Nod ...

最新文章

  1. 三、概念数据模型CDM(Conceptual Database Model )
  2. Win10 下 RabbitMQ 的 安装 配置
  3. php is_null、empty、isset的区别
  4. css列表格式属性,css list-style-type属性笔记
  5. 认识JVM--第一篇-对象分配&回收算法
  6. ExtJs2.0学习系列(6)--Ext.FormPanel之第三式(ComboBox篇)
  7. 聊天机器人-AIML人工智能标记语言
  8. c语言蜂鸣器放音乐程序,蜂鸣器音乐程序设定C语言.doc
  9. 决策树应用实例③——银行借贷模型
  10. 智能音箱中采用的数字音频功放
  11. java 位运算取8位_5巨星生涯全明星队友:乔丹2位,科比8位,那詹姆斯呢?
  12. Vs2017搭建qt开发环境
  13. 真正的通过手机控制PPT播放
  14. 【perl】正则匹配中的括号套括号的套娃抓取规则
  15. 关于vue告警:Closing curly brace does not appear on the same line as the subsequent block
  16. 地理信息的空间认知与GIS语义学
  17. JavaScript实现页面动态验证码
  18. 嵌套语句练习(画三角形)
  19. SpringCloud第九章(消息驱动Strem和RabbitMQ)
  20. 四级英语图表作文真题计算机,[英语学习]四级英语图表作文.ppt

热门文章

  1. 手游代理行业,现在还有机会吗?
  2. 【工控老马】西门子PLC Siemens PLC TCP协议详解
  3. css 字体 图片 动画
  4. matlab毕达哥拉斯质数,“毕达哥拉斯-史仲夏”常用勾股数组表
  5. 佳能镜头EOS系统EF协议逆向工程(一)
  6. Cocos2d-x Lua库函数剖析(二)cocos2d
  7. 开源超融合私有云神器proxmox VE
  8. 黑马全套Java教程(八):集合进阶
  9. spring中的Lifecycle
  10. Mvvm中的Lifecycle