位图排序

1.在编程珠玑中如果一个待排序的数组有这样三个属性:输入数据限制在相对较小的范围内;数据没有重复;而且对于每条记录而言,除了单一整数外,没有任何其他关联数据。就可以用位图来排序。

在32的系统下用unsigned int a[]的数组来表示位图,那么a[0]就可以表示0-31这32个整数了,如果在待排序的数组中出现了这几个数,就把相应的位置1,。

void bit_set(unsigned int i)
{
        a[i / 32] |= 1 << (i & 0x1f);
}

 

其中0x1f代表最多只能移31位。i / 32表示这个落在那个区间内。

bool bit_get(unsigned int i)
{
        return (a[i / 32] & (1 << (i & 0x1f)));
}

看相应的位是否置1.

#include<stdio.h>

#include<stdbool.h>


unsigned int bit[10000] = {0};


void bit_set(unsigned int i)

{
    bit[i / 32] |= 1 << (i & 0x1f);

}


bool bit_get(unsigned int i)

{
    return (bit[i / 32] & (1 << (i & 0x1f)));
}


int main(void)

{
    int i;

    
    FILE *fp_unsort_file = fopen("data.txt", "r");
    
    if (fp_unsort_file == NULL) {
        
            fprintf(stderr, "error of fopen\n");
        
            exit(0);
    }

    
    int num;

    
    while (fscanf(fp_unsort_file, "%d", &num) != EOF) {
        
           if (num < 32 * 10000)
            
                    bit_set(num);
    }

    
    FILE *fp_sort_file = fopen("sort.txt", "w");
    
    for (i = 0; i < 32 * 10000; i++) {
        
          if (bit_get(i)) 
            
               fprintf(fp_sort_file, "%d\n", i);
    
}

    
fclose(fp_sort_file);
    
fclose(fp_unsort_file);

    
return 0;

}
posted @ 2013-10-08 23:34  露天坝  阅读(228)  评论(0编辑  收藏  举报