keep_simple

导航

位排序

数据特性:数据为正整数,比较集中,而且没有重复。

 

代码:

#include <stdio.h>

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITSPERWORD];

void set(int i) {        a[i>>SHIFT] |=  (1<<(i & MASK)); }
void clr(int i) {        a[i>>SHIFT] &= ~(1<<(i & MASK)); }
int  test(int i){ return a[i>>SHIFT] &   (1<<(i & MASK)); }

int main()
{   
    int i;
    int num;

    for (i = 0; i < N; i++)
        clr(i);
    for(i =0; i< 10; ++i)
    {
        scanf("%d", &num);
        set(num);
    }
    for (i = 0; i < N; i++)
    {
        if (test(i))
            printf("---%d\n", i);
    }
    return 0;
}
View Code

 

 

修改:

 

  位向量是一种高效的整数结构,每一个32位的整数通过设置或清除它的某一位,可以保存32个数。如果是一个数组,则可以存更多的数。
    先介绍一下对2的n次方求模的另一种方法。
    如果x = 2,4,8,16,32,64,128...,则y%x = y & (x-1),(y为任意正整数)
    下面介绍位向量的结构:
    class BitVec {
    private:
        enum { BITSPERWORD = 32, SHIFT = 5, MASK = 0x1F };
        int number, upper_limit, *data;
    public:
        BitVec(int max = 0):upper_limit(max)
        {
            data = new int[1 + upper_limit>>SHIFT];
            memset(data,0,sizeof(int)*(1+upper_limit>>SHIFT));
            number = 0;
        }
        ~BitVec()
        {
            delete[] data;
            number = upper_limit = 0;
        }
        void set(int i) { data[i>>SHIFT] |= (1<<(i & MASK)); }
        void clr(int i) { data[i>>SHIFT] &= ~(1<<(i & MASK));}
        bool test(int i) { return data[i>>SHIFT]&(1<<(i & MASK)); }
        void insert(int i)
        {
            set(i);
            ++number;
        }
        void report(int *v)
        {
            int j = 0;
            for(int i = 0; i <= upper_limit; ++i)
                if(test(i))
                    v[j++] = i;
        }
};
其中:data[i>>SHIFT]是找出i用data的第几个元素来表示。比如说,如果i = 33,而一个int只有32位(0-31),因此它在data[1]的第2位表示。顺便提一下,上面用到了enum,有两种方法可以在类内部使用初始化后的成员变量,一种是用enum,另一种是static const。
    既然已经解决了数的存储问题,下一步就可以用这个类来进行排序,想法类似于桶排序,先放进去,再按序取出。
const int MAXVALUE = 100;
void bitsort(int *arr, int lengthofarr)
{
    BitVec bv(MAXVALUE);
    for(int i = 0; i < lengthofarr; ++i)
    {
        bv.insert(arr[i]);
    }
    bv.report(arr);
}

posted on 2013-05-27 14:24  keep_simple  阅读(344)  评论(0)    收藏  举报