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#include 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;}