有苦有乐的算法 --- 基数排序
题目
一个无序数组,使用基数排序的方式从小到大进行排序
解析
给定一个数组:
首先准备一个"桶"(每个桶是一个队列);
从左到右遍历数组,每个元素的个位数是多少,就进入几号桶中;
在从左到右遍历桶,桶内元素先进先出依次排列,得到了一个按个位数从小到大排序的数组;
这个数组从左到右遍历数组,每个元素的十位数是多少,就进入几号桶中,在遍历桶依次排列元素,按十位数从小到大排好序的数组;
在按照百位数重复操作,得到了最终排好序的数组;
代码
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);
}
有苦有乐的算法 --- 基数排序相关推荐
- 有苦有乐的算法 --- 有序数组中的元素存在问题、最左元素问题和无序数组局部最小问题
一个有序数组,判断是否含有一个元素 解析: 给定一个数组 如果需要判断是否存在的元素为3. 首先找到数组的中间元素: 如果此元素为3,结束: 如果不是,此元素与3比较,此元素如果大于3,在从此元素左边 ...
- 有苦有乐的算法 --- 一个数组中,有两种数出现了奇数次,其余数都出现了偶数次,找到这两种数
题目 一个数组中,有两种数出现了奇数次,其余数都出现了偶数次,找到这两组数 例: [2,4,3,2,5,4] ⇒ [3,5] [1,4,6,3,7,8,3,2,1,2,6,6,7,8] ⇒ [6,4] ...
- 有苦有乐的算法 --- 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点
题目 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点. 解析 第一步,判断链表是有环链表还是无环链表: 如果一个单链表无环,它一定有一个指向null的尾结点: 如 ...
- 有苦有乐的算法 --- 获取二叉树的最大宽度
题目 一颗二叉树,求其最大宽度. 例: 解析 按层遍历二叉树: 在遍历时,使用用4个变量来记录信息: Node curEnd = null; // 当前层,最右节点是谁 Node nextEnd = ...
- 有苦有乐的算法 --- 随机快排
题目 使用随机快排对给定数组进行从小到大排序 [5,3,2,1,5] ⇒ [1,2,3,5,5] 解析 给定一个数组 1.在数组中找出一个数作为基准(最右侧的数2):变量l记录数组头位置,变量r记录尾 ...
- 有苦有乐的算法 --- 小和问题
题目 一个无序数组,获取每个元素在左面比这个元素小的个数,求这些个数的和 例: [3,2,5,1,4] ==> 6 [4,7,0,8,2,4,9,4] ==> 14 解析 准备一个无序数组 ...
- 有苦有乐的算法 --- 计数排序
题目 一个数组,其数据范围在0~200之间,将其从小到大排序 解析 给定一个数组: 首先获取去最大值,然后创建一个长度为这个最大值+1的临时数组: 遍历原数组,如果原数组中的元素是n,在临时数组索引为 ...
- 有苦有乐的算法 --- 归并排序
题目 对无序数组进行归并排序,使其有序 解析 准备一个无序数组, 将这个数组平均分成两部分,再把每一部分在平均分成两部分,以此类推,直到分成只剩一个数为止 在将每一部分排序后依次返回 代码 publi ...
- 有苦有乐的算法 --- 图的深度优先遍历
题目 给定一个图,使用栈对其进行深度优先遍历 代码 public static void dfs(Node node) {if (node == null) {return;}Stack<Nod ...
最新文章
- 三、概念数据模型CDM(Conceptual Database Model )
- Win10 下 RabbitMQ 的 安装 配置
- php is_null、empty、isset的区别
- css列表格式属性,css list-style-type属性笔记
- 认识JVM--第一篇-对象分配&回收算法
- ExtJs2.0学习系列(6)--Ext.FormPanel之第三式(ComboBox篇)
- 聊天机器人-AIML人工智能标记语言
- c语言蜂鸣器放音乐程序,蜂鸣器音乐程序设定C语言.doc
- 决策树应用实例③——银行借贷模型
- 智能音箱中采用的数字音频功放
- java 位运算取8位_5巨星生涯全明星队友:乔丹2位,科比8位,那詹姆斯呢?
- Vs2017搭建qt开发环境
- 真正的通过手机控制PPT播放
- 【perl】正则匹配中的括号套括号的套娃抓取规则
- 关于vue告警:Closing curly brace does not appear on the same line as the subsequent block
- 地理信息的空间认知与GIS语义学
- JavaScript实现页面动态验证码
- 嵌套语句练习(画三角形)
- SpringCloud第九章(消息驱动Strem和RabbitMQ)
- 四级英语图表作文真题计算机,[英语学习]四级英语图表作文.ppt