最近新了解到一个排序方法 位图排序法,定义一个String或者数组,长度等于排序数字的最大范围值(必须知道范围,比如都是七位数),然后将数值对应的角标处的值设为true/1或者其他标识值,循环放完值后,将值等于标识值的角标打印出来。 局限性: 1. 必须知道排序数字的范围 2. 由于位图排序法需要创建的字符串或数组的长度很长,需要循环很多遍,如果排序数字的个数很少时,效率很低。 public class TestOrder { public static void main(String []args){ setOrder(); } /** * 生成 7 位的整数,必须是七位 * @return */ public static int gen(){ Random random = new Random(); // 获取小于10000000 的整数 int i = random.nextInt(10000000); // 如果生成的整数小于七位 ,那么需要补上七位 if(i<1000000){ // 生成0-9的整数 int x = random.nextInt(10); // 如果等于零就将1 赋值给i1 x = x==0 ? x : 1; // 补上生成的七位数字 i = x * 1000000 + i; } return Integer.valueOf(i); } /** * 实现 位图法排序 */ public static void setOrder(){ // 创建一个最大七位数 长度 的boolean数组,用来保存排序的数字 boolean [] barr = new boolean[9999999]; // 创建循环生成十个七位数 for(int i=0;i<10;i++){ int gen = gen(); System.out.print(" " + gen); if(gen % 5 ==0){ System.out.println(); } // 将生成的七位数的数值作为角标,设置对应boolean数组中该角标下的值为true // 循环结束后,值为true的角标就是参加过排序的 数值, // 按照角标顺序打印出来角标,就是按升序打印出排好序的数值 barr[gen]= true; } System.out.println("开始打印排序后的:"); for(int i=1000000;i<barr.length;i++){ if(barr[i]==true) // 将角标打印出来 System.out.print(" " + i); } } }
位图排序法初试
最新推荐文章于 2019-04-10 22:04:14 发布