排序算法java 二 --基数排序、归并排序
2016-05-05 20:56
477 查看
1、基数排序----基本实现思想: 首先判断数组中数据最大的位数,然后比较个位上的数字,进行排序,然后比较其他位上的数字,依次进行排序。
2、归并排序,不要看代码长,理解起来相对简单.gap是1、2、4、8...变化的,符合两个数组合并后的数组元素个数的变化。归并排序,首先两两一组比较排序,然后相邻的第一个组元素和第二个组元素比较排序合并成一个数组,依次进行。
/** * 基数排序 */ public static void radixSort(int []array){ int max = array[0];//找最大值 for (int i = 0; i < array.length; i++) { if (array[i] > max) { max = array[i]; } } int time = 0;//确定几位数字 while (max > 0) { max /= 10; time++; } List<ArrayList<Integer>> list = new ArrayList<>();//存储的十个桶用来存储0-9的数字的集合 for (int i = 0; i < 10; i++) { list.add(new ArrayList<Integer>()); } //按照各个位数进行排序 for (int i = 0; i < time; i++) {//最大数位数即循环次数 for (int j = 0; j < array.length; j++) { //取到当前这个数对应位置的一位数 int a = array[j] / pow(i); int b = a % 10;//求各个位上的数字 list.get(b).add(array[j]); } //各个位上的数进行排序 int n = 0; for( ArrayList<Integer> arrayList : list){ if (arrayList.size() != 0) { for(Integer inner : arrayList){ array = inner.intValue();//拆箱操作 n++; } arrayList.clear(); } } } System.out.println("------" + Arrays.toString(array)); } private static int pow(int n){//用来求10的n次方,也可调用Math.pow(10,n); int value = 1; for (int i = 0; i < n; i++) { value *= 10; } return value; }
2、归并排序,不要看代码长,理解起来相对简单.gap是1、2、4、8...变化的,符合两个数组合并后的数组元素个数的变化。归并排序,首先两两一组比较排序,然后相邻的第一个组元素和第二个组元素比较排序合并成一个数组,依次进行。
/** * 归并排序 */ public static void mergeSort(int []array){ //前一个有序组合 ArrayList<Integer> listLeft = new ArrayList<>(); //后一个有序组合 ArrayList<Integer> listRight = new ArrayList<>(); //两个有序组合合并的结果 ArrayList<Integer> list = new ArrayList<>(); for (int gap = 1; gap < array.length; gap = gap * 2) { for (int i = 0; i < array.length; i++) { if (listLeft.size() < gap) { listLeft.add(array[i]); }else { if (listRight.size() < gap) { listRight.add(array[i]); } } if (listLeft.size() == gap && listRight.size() == gap || (listLeft.size() == gap && listRight.size() < gap && i == array.length - 1)) { switchArray(listLeft, listRight, list); listLeft.clear(); listRight.clear(); } } for (int j = 0; j <list.size(); j++) { array[j] = list.get(j); } listLeft.clear(); listRight.clear(); list.clear(); System.out.println(Arrays.toString(array)); } } private static void switchArray(ArrayList<Integer> listLeft,ArrayList<Integer> listRight,ArrayList<Integer> list ){ int m = 0; int n = 0; while (m < listLeft.size() && n < listRight.size()) { while(m < listLeft.size() && n < listRight.size() && listLeft.get(m) < listRight.get(n)){ list.add(listLeft.get(m)); m++; } while (n < listRight.size() && m < listLeft.size() && listLeft.get(m) >= listRight.get(n)) { list.add(listRight.get(n)); n++; } } while (m < listLeft.size()) {//两个数组比较合并后剩余的元素依次添加到集合中,合并成一个数组 list.add(listLeft.get(m)); m++; } while (n < listRight.size()) { list.add(listRight.get(n)); n++; } }
相关文章推荐
- Java集合框架
- druid在spring中的配置已经maven中的配置
- Java中数字字符串与对应数字的转换
- 官网下载java相关资源
- java常用类
- java通过xml配置属性用iText包生成pdf文件
- Spring Security 4 整合Hibernate Bcrypt密码加密(带源码)
- 【第二章】 IoC 之 2.3 IoC的配置使用——跟我学Spring3
- 手动制作hadoop-eclipse-plugin插件
- Java线程中 start与run的区别以及源码分析
- Spring IOC 深入分析
- Java线程之CompletionService批处理任务
- Myeclipse的使用
- struts.properties配置详解
- 使用纯java基本语言实现泰勒展开的sin和cos计算
- 排序算法java 一 --快速排序、直接插入、希尔排序
- Eclipse常用快捷键
- JAVA 内存泄露详解(原因、例子及解决)
- Java并发编程的艺术(上)
- JAVA修饰符