编程珠玑第一章的算法,Java实现,通俗易懂
2013-11-03 02:05
288 查看
该算法也就是所谓的位图算法,用一个int表示32位,也就是实际值为1~32的数.
按照书里说的, 该算法只适合内存有限,而磁盘和时间不限,且数字在1~MAX之间不重复的排序.
这个程序的输出是:
需要312500个数组元素
原始值5下标0偏移4新结果134217728
原始值888下标27偏移23新结果256
原始值4下标0偏移3新结果402653184
原始值2下标0偏移1新结果1476395008
原始值6下标0偏移5新结果1543503872
原始值7下标0偏移6新结果1577058304
原始值3下标0偏移2新结果2113929216
原始值10下标0偏移9新结果2118123520
原始值567下标17偏移22新结果512
原始值456下标14偏移7新结果16777216
原始值234下标7偏移9新结果4194304
原始值123下标3偏移26新结果32
原始值66666下标2083偏移9新结果4194304
原始值55555下标1736偏移2新结果536870912
原始值3333333下标104166偏移20新结果2048
原始值8908764下标278398偏移27新结果16
2,3,4,5,6,7,10,123,234,456,567,888,55555,66666,3333333,8908764,
Process finished with exit code 0
按照书里说的, 该算法只适合内存有限,而磁盘和时间不限,且数字在1~MAX之间不重复的排序.
package demo1; /** * Created with IntelliJ IDEA. * User: wsyang * Date: 13-11-3 * Time: 8:11 * To change this template use File | Settings | File Templates. */ public class BitSort { public static void main(String[] args) { //每个int类型数的位数(1个int数是4个字节,1个字节等于8位,所以是32=4*8) int size = 32; //最大值 int MAX= 10000000; //计算出需要多大的数组,才能按位保存MAX个数.数组中每一个元素,也就是int数,能保存32位,所以是如下算数. int arraySize = MAX/size + (MAX%size==0?0:1); System.out.println("需要"+arraySize+"个数组元素"); int[] datas = new int[arraySize]; //测试数据 int[] orginal = new int[]{5,888,4,2,6,7,3,10,567,456,234,123,66666,55555,3333333,8908764}; //完成位图的填充 for(int i=0;i<orginal.length;i++){ int v = orginal[i];//原始值 //假设数值是33,因为1个int也就是32位只能表示1~32,因此,需要算出: int index = v/size + (v%size==0?0:1)-1;//数组第几项才能表示目标数v int pos = v % size - 1;//偏移量,也就是数组的index位置的int数的第几位才是这个数 //这里用了按位与运算,因为假设原值是000100,计算出偏移量是30,也就是说,倒数第二位是1,合并进去就是001 10. //因此这里按位与运算最合适 int newResult = datas[index] | 1<< 31-pos;//新结果 //更新值 datas[index]=newResult; System.out.print("原始值" + v); System.out.print("下标" + index); System.out.print("偏移" + pos); System.out.print("新结果" + newResult); System.out.println(); } //遍历位图,输出结果 for(int i=0;i<datas.length;i++){ int data = datas[i]; //有了data这个十进制数,如何得到她的二进制的每位值呢? //很简单,需要得到某位的值,就将该数右移31-第几位,并将除末位外的所有位置为0,就能知道该位实际值. for(int index=0;index<31;index++){ //上条注释所言的计算方法 int posVal = (data >> (31-index)) & 1; if(posVal==1){ //如果该位是1,那么说明该位是有值的,输出她 //由于我们进行了拆分,也就是说当i=1时,基数是32开始,偏移量为1,就是33 int result = size*i + index+1; System.out.print(result + ","); } } } } }
这个程序的输出是:
需要312500个数组元素
原始值5下标0偏移4新结果134217728
原始值888下标27偏移23新结果256
原始值4下标0偏移3新结果402653184
原始值2下标0偏移1新结果1476395008
原始值6下标0偏移5新结果1543503872
原始值7下标0偏移6新结果1577058304
原始值3下标0偏移2新结果2113929216
原始值10下标0偏移9新结果2118123520
原始值567下标17偏移22新结果512
原始值456下标14偏移7新结果16777216
原始值234下标7偏移9新结果4194304
原始值123下标3偏移26新结果32
原始值66666下标2083偏移9新结果4194304
原始值55555下标1736偏移2新结果536870912
原始值3333333下标104166偏移20新结果2048
原始值8908764下标278398偏移27新结果16
2,3,4,5,6,7,10,123,234,456,567,888,55555,66666,3333333,8908764,
Process finished with exit code 0
相关文章推荐
- 《算法》(第四版)第一章练习题Java实现[3]
- java实现位图排序算法《编程珠玑》第一章笔记
- 《算法》(第四版)第一章练习题Java实现[2]
- 《算法》(第四版)第一章 练习题Java实现
- (Java实现) HDOJ 2063 过山车 匈牙利算法
- JAVA实现最短距离算法之迪杰斯特拉算法
- Java实现文件的DES加密与解密算法
- 趣写算法系列之--匈牙利算法 Java实现
- 【LeetCode-面试算法经典-Java实现】【200-Number of Islands(岛的数目)】
- java 几种基础算法的实现 (五)
- 两个相交的圆形,第一个圆形内包含很多点,第二个圆内包含很多点,现在要求两个圆内相交的点是哪些,用随便的java或matlab算法如何实现呢?
- 算法-java代码实现计数排序
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现
- 最大子序列算法的JAVA实现
- 百度武汉站笔试题——算法题第一第二题Java实现
- Java实现的快速查找算法示例
- 给大家推荐一个LRU实现算法的java 代码
- Java贪心算法之Prime算法原理与实现方法详解
- java实现 排序算法之直接插入排序
- 剑指Offer面试算法题Java实现