java实现位图排序算法《编程珠玑》第一章笔记

<<编程珠玑>>习题1.6 第三题  

假设n为10 000 000, 且输入文件包含 1 000 000 个正数 ,使用位图排序实现。

本文将使用java实现上述代码。


	static int BITSPERWORD=32;
	static int SHIFT=5;
	static byte MASK=0x1F;
	static int N=10000000;
	static int a[]=new int[1+N/BITSPERWORD];//每个int是4字节32位能存32个数字
	
	//随机生成不重复的
	public static Set<Integer> randomGenerate(){
		Set<Integer> set = new HashSet<>();//set中的值不重复
		System.out.println(set.size());
		System.out.println(System.currentTimeMillis());
		for(;set.size()<1000000;){
			set.add(new Random().nextInt(10000000));
		}
		System.out.println(set.size());
		System.out.println(System.currentTimeMillis());
		return set;
	}

	//清除位值
	public static void clr(int i){
		a[i>>SHIFT] &= ~(1<<(i & MASK));
	}
	//设置位值
	public static void set(int i){
		a[i>>SHIFT] |= (1<<(i & MASK));// i & MASK  相当于 i%31 , 左移 这个位数 就是 余数 在某位设1 ,
					       //a[i>>SHIFT] 等同a[i/32] 因为每个int可以保存32个数字

	}
	//测试位值
	public static int test(int i){
		double x = i >> SHIFT;
		double y =  Math.log(1<<(i & MASK))/Math.log(2);
		System.out.println("对应数字"+(x+y));
		return a[i>>SHIFT] & (1<<(i & MASK));
	}
	public static void main(String[] args) {
		
		Set<Integer> set =randomGenerate();
		
		for (int i=0;i<N;i++){
			clr(i);
		}
		for(Integer a : set){
			set(a);
		}
		for(int j=0 ; j < 31;j++){
			
			System.out.println(test(j));
		}
		
		
	}




本书的目标读者是准备去硅谷找工作的码农,也适用于在国内找工作的码农,以及刚接触ACM算法竞赛的新手。 市场上讲解算法的书已经汗牛充栋,为什么还要写这本书呢?主要原因是我对目前市场上的大部分算法书都不太满意。 本书有如下特色: 背后有强大的AlgoHub支持。 本书的所有题目,都可以在 www.algohub.org(即将上线) 上在线判断代码。这样的一大好处是,读者可以边看书,边实现自己的代码,然后提交到网站上验证自己的想法是否正确。AlgoHub的使命是成为最好的算法学习和交流平台。AlgoHub囊括了 POJ, ZOJ, leetcode, HackerRank 等网站的经典题目(一些质量不高的题目则忽略),且 AlgoHub有非常简单的加题系统,用户不需要写一行代码即可自己添加题目,所以AlgoHub的题库还在飞速增长中。 每道题都有完整的代码。 市场上的大部分书,都会讲思路,但给出的代码都是片段,不是完整可编译的代码。本书每题都有完整的代码,且每个代码经过千锤百炼,保证可读性的前提下尽可能简短,方面读者在面试中能快速写出来。 每道题都有多种解法。 本书的宗旨是,用尽可能少的题目,覆盖尽可能多的算法。本书中的的每道题都有多种解法,每种解法不是简单的小改进,而是完全不同的思路,力求举一反三,让读者触类旁通。 本书支持多种主流编程语言。 目前支持 Java, C++, C#, Python, Ruby, JavaScript, Swift, Scala, Clojure, 将来还会支持更多编程语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖民工金币

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值