位图排序法初试

最近新了解到一个排序方法 位图排序法,定义一个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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值