位图方法排序

来源:互联网 发布:淘宝花呗还款有利息吗 编辑:程序博客网 时间:2024/04/30 08:39
要使用位图方法排序,有三个前提条件:
1.  元素是整数
2.  集合内的最大上限数是已知的
3.  元素是唯一的

位图的方法原理:略。
其时间复杂度是 O(n),所以排序方法会非常快。
以下给出JAVA代码:

public class MyMath {
   
    private static final int SHIFT = 5 ; // int型,32位,则移位数为 5
    private static final int BIT_MOD = 31;
   
   
    public static void bitOrder(int[] digits,int max){
        int[] bits = new int[ (max >> SHIFT) + 1 ];
        // 把数组的数设置相应位的值为1
        for (int i = 0; i < digits.length; i++) {
            setBit(bits,digits[i]);
        }
        // 顺序拿出位值为1的位,复制给数组,即排序完成。
        int orderIndex = 0;
        for (int i = 0; i < bits.length; i++) {
            for(int bi=0; bi<=BIT_MOD; bi++){
                if( isBit1(bits[i],bi) ){
                    digits[orderIndex] = bi + ( i << SHIFT );
                    orderIndex++;
                }
            }
        }
        assert digits.length == orderIndex : "长度不匹配,算法有误";
    }
    // 设置位
    public static void setBit(int[] dest, int number){
        dest[number >> SHIFT] |= (1 <<  (number & BIT_MOD) );
    }
    // 判断位是否为1
    public static boolean isBit1(int number, int bi){
        return (number & 1<<bi) == (1<<bi)  ;
    }
}

备注:位图方法除了排序后,还能给集合内的元素去重。
另外若元素有重复的,此排序算法可作相应的改变。(有兴趣的朋友自行研究)
原创粉丝点击