数组中有重复数据统计并按照次数的由大到小排列出来
2012-12-07 12:08
381 查看
此文主要是警醒自己,自己以前也写过此算法的实现,但对比下,发现还是下算法是真正的教科书式经典实现,而且下代码主要由一位MM完成,让我反省了IT行业的性别歧视。
中心思想:遍历数组,依次插入到二叉排序树,如果找到数字相等的,节点的count++;中序遍历算法,输出这个二叉排序树。(PS:如果想得到标准的O(Nlog2N)算法,可以通过旋转树枝的办法,减小树的高度,把二叉排序树优化为平衡二叉树。)
节点类:
二叉排序树的类:
中心思想:遍历数组,依次插入到二叉排序树,如果找到数字相等的,节点的count++;中序遍历算法,输出这个二叉排序树。(PS:如果想得到标准的O(Nlog2N)算法,可以通过旋转树枝的办法,减小树的高度,把二叉排序树优化为平衡二叉树。)
节点类:
package tm.cao.sort; /** * 节点类 * */ public class TreeNode { /** * 关键字 */ private int data; /** * 左子树 */ private TreeNode leftCh; /** * 右子树 */ private TreeNode rightCh; /** * 关键字出现的次数 */ private int count; public int getData() { return data; } public TreeNode getLeftCh() { return leftCh; } public TreeNode getRightCh() { return rightCh; } public int getCount() { return count; } public void setData(int data) { this.data = data; } public void setLeftCh(TreeNode leftCh) { this.leftCh = leftCh; } public void setRightCh(TreeNode rightCh) { this.rightCh = rightCh; } public void setCount(int count) { this.count = count; } public TreeNode(int data) { super(); this.data = data; this.count=1; } public TreeNode(int data, TreeNode leftCh, TreeNode rightCh) { super(); this.data = data; this.leftCh = leftCh; this.rightCh = rightCh; this.count = 1; } public TreeNode() { super(); } /* 为了便于调试和输出 生成toString() */ @Override public String toString() { return "数字=" + data + ", 出现次数=" + count + ""; } }
二叉排序树的类:
package tm.cao.sort; import org.junit.Test; /** * 二叉排序树的类 * */ public class TreeInsert { /** * 根节点 */ private TreeNode root; public TreeNode getRoot() { return root; } public void setRoot(TreeNode root) { this.root = root; } /** * 总的方法 */ public void createTreeAndOutPut(int[] array){ //只需遍历一次数组 遍历的同时插入节点到排序树 for(int data:array){ this.insertNode(data); } //中序输出这个排序树 this.middleOrder(root); } /** * 中序遍历 递归算法 p为当前节点的指针 */ public void middleOrder(TreeNode p){ if(p!=null){ //遍历左子树 this.middleOrder(p.getLeftCh()); //遍历本次节点 System.out.println(p); //遍历右子树 this.middleOrder(p.getRightCh()); } } /** * 插入单个节点的方法 */ public void insertNode(int data){ //如果没有根节点 创造新的根节点 if(this.getRoot()==null){ root=new TreeNode(data); }else{ //初始化指针p指向根节点 TreeNode p=root; while(true){ //如果p的data小于data if(p.getData()<data){ //如果p没有左子树 则直接插入到p的左子树 if(p.getLeftCh()==null){ TreeNode leftCh=new TreeNode(data); p.setLeftCh(leftCh); break; }else{ //如果p有左子树 则让指针指向p的左子树 继续遍历 p=p.getLeftCh(); continue; } } //插入右子树的情况 和左子树类似 else if(p.getData()>data){ if(p.getRightCh()==null){ TreeNode rightCh=new TreeNode(data); p.setRightCh(rightCh); break; }else{ p=p.getRightCh(); continue; } }else{ //设置重复的情况 不必插入新的节点,直接让p的count加1 int count=p.getCount(); count++; p.setCount(count); break; } } } } /** * 用于测试的类 为了程序的健壮性,我们多生成些随机数放入数组 */ @Test public void test(){ TreeInsert ti=new TreeInsert(); int[] array={3,47,43,73,86,36,96,47,36,61,46,99,69,81,62,97,74,24,67,62,42,81,14,57,20,42,53,32,37,32,16,76,2,27,66,56,50,26,71,7,32,90,79,78,53,12,56,85,99,26,96,96,68,27,31,5,3,72,93,15,55,59,56,35,64,38,54,82,46,22,31,62,43,9,90}; ti.createTreeAndOutPut(array); } }
相关文章推荐
- python字典分别按照key和value升序或者降序排列--以给定一个含有重复元素的数组list,按照其出现次数大小降序输出
- 运用冒泡法结合数组,讲给定的数据按照降序排列出来
- 2014华为机试题——取出整型数据中出现次数最多的元素,并按照升序排列返回
- java版本: 把手机号码里重复数字出现的次数按从多到少排列打印出来
- * 先往文件保存10个花类(包括花编号,花名称,花龄)对象,再取出来 * 去掉花名重复的花对象,再按照花龄升序排列
- 去除数组中重复项,并统计重复出现次数最多的元素及重复次数
- 一个一维整形数组,若干个数字,统计数组中不同的数字出现的次数,并按照出现频率从小到大排序输出,相同频率按数字大小排序输出
- 使用SQL语句对重复记录查询、统计重复次数、删除重复数据
- 统计 数据中 重复值的次数( 另外,可再对其进行排序,重复次数多的在前边
- 检索算法 ---利用二分查找进行数据重复次数统计
- 通过awk统计history中使用命令,并按照统计的次数降序排列,并只显示其中20行
- JavaScript 数组去重并统计重复元素出现的次数
- 统计数据重复次数
- JavaScript 数组去重并统计重复元素出现的次数实例
- 统计数组中各个元素出现的次数,并按照次数从大到小排序
- 随机产生50个30到35的整数,统计每个数字出现的次数(TreeMap实现),输出时按照数字的降序排列,并且统计出现次数最多的数字和它的次数。
- 统计每个数的重复次数,并按照重复次数由高到低排序的批处理
- 统计数组中各个元素出现的次数,并按照次数从大到小排序
- 算法研究:如何将数组中的重复数据查找出来
- 用数组输出一段字符,并将其按照由大到小的顺序排列出来