计数排序题
2016-07-27 15:16
399 查看
一组随机排列的字母数组。请编写一个时间复杂度为O(n)的算法,使得这些字母按照字母从小到大顺序排好。
说明:字母区分大小写,相同的字母,排序后小写排在大写前。
例如:R,B,B,b,W,W,B,R,B,w
排序为:b,B,B,B,B,R,R,w,W,W
1)描述思路(2分)
2)请用你熟悉的编程语言编码实现(8分)
解答:
1)把字母转映射为数字,然后用计数排序算法排序,得到的排序后再映射回原来的字母。
2)
说明:字母区分大小写,相同的字母,排序后小写排在大写前。
例如:R,B,B,b,W,W,B,R,B,w
排序为:b,B,B,B,B,R,R,w,W,W
1)描述思路(2分)
2)请用你熟悉的编程语言编码实现(8分)
解答:
1)把字母转映射为数字,然后用计数排序算法排序,得到的排序后再映射回原来的字母。
2)
/*** * 计数排序算法实现 * @author haward * 时间复杂度:O(N) */ public class CountSort { public static void countSort(int[] arr) { if(arr==null||arr.length==0) return; int max=max(arr); int[] count=new int[max+1]; Arrays.fill(count, 0); //计数 for(int i=0;i<arr.length;i++) { count[arr[i]]++; } int k=0; for(int i=0;i<=max;i++) { for(int j=0;j<count[i];j++) { arr[k++]=i; } } } public static int max(int[] arr) { int max=Integer.MIN_VALUE; for(int ele:arr) { if(ele>max) { max=ele; } } return max; } } @org.junit.Test public void testcountSort() { int[] arr={'R','B','B','b','W','W','B','R','B','w'}; //将每个元素乘以2 for(int i=0;i<arr.length;i++) { arr[i]*=2; } //arr[i]-=65的目的是把小写字母插入到大写字母的排列中 for(int i=0;i<arr.length;i++) { if(arr[i]>='a'*2&&arr[i]<='z'*2) { arr[i]-=65;//32.5*2 } } //计数排序 CountSort.countSort(arr); //对排序后的元素还原 for(int i=0;i<arr.length;i++) { if(arr[i]%2==0) 99ec { arr[i]/=2; }else{ arr[i]=(arr[i]+65)/2; } } for(int i=0;i<arr.length;i++) { System.out.print((char)arr[i]); } }
相关文章推荐
- ubuntu配置openc环境
- mysql根据汉字首字母排序的方法
- 模板容器类的实现一(基于动态数组)
- C# 使用OCR识别中文
- Java中的二分法查找算法
- DAY02_不要自己随便去‘创造’加密算法
- nodejs的后端字符串验证器-validator
- gdb optimized out错误解决
- 蘑菇街 修理桌子
- Java 序列化Serializable详解
- 自学jQuery的随笔1
- POJ 3468 A Simple Problem with Integers(区间更新)
- poj3278 线上的BFS搜索
- EBS FA资产模块新增CIP在建工程手册
- SlidingMenu侧拉菜单的使用
- XZ_HTML5之HTML文档类型和头部
- Java后台---从底层了解Session会话、pageContext
- IMP-00008: unrecognized statement in the export file: string的问题分析
- 华为路由器ospf的路由控制及安全
- 发现一个比较有价值的论坛