`

编程珠玑-第一章-位图排序

阅读更多

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Random;

public class BitMapSearch {

    /**
     * 编程珠玑 第一章 位图排序
     */

    public static final int SHIFT = 5; // 2^5=32=Integer.SIZE,不直接写32的原因是为了用移位代替除法
    public static final int MASK = 0x1F; // 31=(0001,1111)
    public static final Random random = new Random();

    public static void main(String[] args) {
        BitMapSearch test = new BitMapSearch();
        int length = 10;
        int max = 99;
        int[] array = test.generateOriginArray(length, max);
        
        //输出到文件,方便观察测试结果
        test.outputArray(array, "d:/tmp/beforeSort.txt");
        int[] sortedArray = test.sort(array, max);
        test.outputArray(sortedArray, "d:/tmp/afterSort.txt");
        System.out.println("is sorted ? " + test.isSorted(sortedArray));
    }

    public int[] sort(int[] x, int max) {

        if (x == null || x.length < 2) {
            return x;
        }

        int len = x.length;
        
        //分块。一块(h[i]), 32bit,可以代表32个数
        int[] h = new int[1 + (max / 32)];
        for (int i = 0; i < len; i++) {
            set(h, x[i]);   // 将对应的bit置为1
        }

        int[] y = new int[len];
        for (int j = 0, i = 1; i < max; i++) {
            if (exist(h, i)) {  // 检查对应的bit位上是否为1
                y[j++] = i;
            }
        }
        return y;
    }

    public void set(int[] h, int i) {
        h[i >> SHIFT] |= (1 << (i & MASK)); // h[i>>SHIFT]这里面的移位操作达到分块的效果
    }

    public boolean exist(int[] h, int i) {
        return ((h[i >> SHIFT]) & (1 << (i & MASK))) != 0;
    }

    /*
    //打乱数组
    public void shuffle(int[] x) {
        int L = x.length;
        for (int i = L; i > 1; i--) {
            int j = random.nextInt(i);
            swap(x, i - 1, j);
        }
    }

    // has not been used in this case
    public void clear(int[] h, int i) {
        h[i >> SHIFT] &= ~(1 << (i & MASK));
    }
    */
    
    public void swap(int[] x, int i, int j) {
        int tmp = x[i];
        x[i] = x[j];
        x[j] = tmp;
    }
    

    /**
     * 随机生成指定长度的正整数数组,没有重复
     * @param length 数组长度
     * @param max 数组元素的最大值
     * @return
     */
    public int[] generateOriginArray(int length, int max) {
        
        //1~max
        int[] sample = new int[max];
        for (int i = 0; i < max; i++) {
            sample[i] = i + 1;
        }
        
        //随机选出length个元素
        int[] array = new int[length];
        for (int i = 0; i < length; i++) {
            int pos = random.nextInt(max);
            array[i] = sample[pos];
            sample[pos] = sample[max - 1];
            max--;
        }
        
        return array;
    }
    

    public void outputArray(int[] array, String filePath) {
        if (array == null || array.length == 0) {
            return;
        }

        File file = new File(filePath);
        if (file.exists()) {
            file.delete();
        }
        
        //StringBuilder的长度太大,会造成溢出,跟JVM的内存大小有关。为避免这种情况,达到指定长度后就输出
        int fixedLength = 1000;
        StringBuilder sb = new StringBuilder(fixedLength);
        for (int i = 0, len = array.length; i < len; i++) {
            sb.append(array[i] + "\n");
            if (sb.length() == fixedLength || (i == len - 1)) {
                this.appendStringToFile(sb.toString(), filePath);
                sb = new StringBuilder(fixedLength);
            }
        }
    }
    
    public boolean isSorted(int[] array) {
        boolean result = true;
        for (int i = 0, len = array.length; i < len -1; i++) {
            if (array[i] > array[i + 1]) {
                result = false;
                break;
            }
        }
        return result;
    }

    public void appendStringToFile(String str, String filePath) {
        Writer bw = null;
        FileWriter fileWriter = null;
        try {
            fileWriter = new FileWriter(filePath, true);
            bw = new BufferedWriter(fileWriter);
            bw.write(str);
        } catch (Exception e) {
            System.out.println("append to file failed");
            e.printStackTrace();
        } finally {
            try {
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
1
2
分享到:
评论

相关推荐

    ASP.NET\ASP.NET 2.0编程珠玑--来自MVP 2.0编程珠玑--来自MVP的权威开发指南

    《ASP.NET 2.0编程珠玑--来自MVP的权威开发指南》一书深入探讨了ASP.NET 2.0的核心概念和技术,旨在帮助开发者熟练掌握这一平台。 在ASP.NET 2.0中,控件是构建用户界面的关键组件。它们包括服务器控件和HTML控件,...

    编程珠玑-中文第二版

    综上所述,《编程珠玑-中文第二版》不仅仅是一本关于编程技术的书籍,它更像是一位经验丰富的导师,引领着初学者进入编程的世界,并不断启发他们去探索更多的可能性。对于任何希望提升自己编程技能或对计算机科学感...

    编程珠玑-第2版-修订版

    《编程珠玑(第 2版·修订版)》是计算机科学方面的经典名著。书的内容围绕程序设计人员面对的一系列实际问题展开。作者JonBentley以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员...

    编程珠玑-[美]乔恩美特利.mobi

    编程珠玑-[美]乔恩美特利.mobi、kindle文档、第二版修订版

    编程珠玑--算法

    编程中的一本关于算法的好书。

    编程珠玑-第2版

    无书签,

    asp.net 2.0编程珠玑--来自mvp的权威开发指南

    《ASP.NET 2.0编程珠玑--来自MVP的权威开发指南》是一本深入探讨ASP.NET 2.0技术的专业书籍,由该领域的专家,即微软最有价值专家(MVP)撰写。这本书旨在帮助开发者充分理解和掌握ASP.NET 2.0的核心概念,提升其在...

    编程珠玑-英文版+中文版+source code

    《编程珠玑》是计算机科学领域的一本经典之作,由Jon Bentley 编著,它以其深入浅出的方式探讨了程序设计中的许多核心问题。这本书主要关注如何有效地处理和存储大量数据,以及如何在时间和空间效率之间找到平衡。...

    ASP.NET 2.0编程珠玑--来自MVP的权威开发指南

    这本书“ASP.NET 2.0编程珠玑--来自MVP的权威开发指南”深入讲解了这个框架的关键特性和最佳实践,旨在帮助开发者充分利用其功能。 在ASP.NET 2.0中,最重要的改进之一是页面生命周期管理。与前一版本相比,2.0版...

    编程珠玑-pdf

    编程珠玑,第二版,高清版,带目录,对学习编程有一些帮助

    ASP.NET+2.0编程珠玑--开发指南

    本书“ASP.NET+2.0编程珠玑--开发指南”是针对这个版本的专业指南,由MVP(Microsoft最有价值专家)撰写,旨在帮助开发者深入理解和掌握ASP.NET 2.0的核心概念和技术。 书中可能涵盖了以下关键知识点: 1. **ASP...

    位图排序《编程珠玑》

    实现位图排序,其中假设n为10 000...具体细节详见《编程珠玑》第一章问题; 由于数据的大小问题,在这#define N 1000,即数据在1000以内的100个数据,进行排序(当然由于随机数的产生问题,有数重复,在此并未处理);

    编程珠玑之位图排序

    输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数关联。 输出:按升序排列的输入整数列表。 约束:最多有(大约)1MB的...

    ASP.NET+2.0编程珠玑--来自MVP的权威开发指南(无密码)

    此压缩包文件提供的"ASP.NET+2.0编程珠玑--来自MVP的权威开发指南"是一本深入探讨ASP.NET 2.0技术的书籍,可能包含了以下关键知识点: 1. **ASP.NET 2.0概述**:ASP.NET 2.0在ASP.NET 1.x的基础上进行了许多改进,...

    编程珠玑 第2版(修订版)_编程珠玑修订_资料_

    《编程珠玑 第2版(修订版)》是一本深受程序员喜爱的经典著作,它不仅提供了丰富的编程实践经验,还深入探讨了程序设计的艺术与智慧。这本书的修订版更是在原版基础上进行了更新和完善,旨在帮助程序员提升编程技能,...

    编程珠玑 -- swap section

    NULL 博文链接:https://philoscience.iteye.com/blog/1010964

Global site tag (gtag.js) - Google Analytics