码迷,mamicode.com
首页 > 其他好文 > 详细

位图排序

时间:2014-05-15 04:41:27      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   c   

基于比较的排序时间复杂度至少为O(nlgn),在时间上堆排序快速排序基本上都达到了比较排序的极限,如果要获取更快的排序速度,就需要找不是基于比较的排序方法,位图排序就是其中的一个。

位图排序是效率最高的排序算法,其时间复杂度是O(n),空间复杂度也非常小,但是要求输入的数据不能重复,而且要知道数据的范围。

位图排序的思想比较简单,用计算机的每一位表示一个数,一个int类型的变量就能表示32个数。比如说集合{1,2,5,7}能用二进制串01010110表示,因为这个串中的第1,2,5,7位为1(低位在右端),其他位为0。

利用这种思想我们把一个数组看成一个二进制串,每输入一个数将其所对应的位置1,输出时依次判断每一位,如果是1,就输出对应的数据。位图排序的关键子程序是置位程序和测试程序,分别对应输入和输出。

下边是位图排序的java实现:


package lamoop;
public class BitSort {
    static int WORDLENGTH = 32;
    static int SHIFT = 5;
    static int MASK = 0x1F;
    static int MAX = 10000000;
    static int[] A = new int[(1 + MAX / WORDLENGTH)];
                                              
    public static void main(String[] args) {
        int[] data = {568746,12354,45798,1245,8,17,1,5};
        bitsort(data);
    }
                                              
    public static void bitsort(int[] array) {
        for (int i = 0; i < array.length; i++)
            set(array[i]);
        for (int i = 0; i < MAX; i++)
            if (test(i))
                System.out.println(i);
    }
                                              
    //将A[i>>SHIFT]的第(i & MASK)位置1
    public static void set(int i) {
        A[i >> SHIFT] |= (1 << (i & MASK));
    }
                                              
    //测试A[i>>SHIFT]的第(i & MASK)位置是否为1
    public static boolean test(int i) {
        return (A[i >> SHIFT] & (1 << (i & MASK)))
                == (1 << (i & MASK));
    }
}


 

在java中还可以使用bitset很容易的实现位图排序:

package lamoop;
                             
import java.util.BitSet;
                             
public class BitSort {
    static int MAX = 10000000;
                             
    public static void main(String[] args) {
        int[] data = { 5746, 14, 498, 125, 8, 17, 1, 5 };
        BitSet bitSet = new BitSet(MAX);
        for (int i : data) {
            bitSet.set(i);
        }
        for (int i = 0; i < MAX; i++) {
            if(bitSet.get(i)){
                System.out.println(i);
            }
        }
    }
}


位图排序,布布扣,bubuko.com

位图排序

标签:style   blog   class   code   java   c   

原文地址:http://blog.csdn.net/aigoogle/article/details/25715835

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!