- #include <stdio.h>
- #include <stdlib.h>
- #define INT_BY_BIT 32
- #define MASK 0x1F
- #define SHIFT 5
- #define N 1000000
- int a[N/INT_BY_BIT+1];
- void set_bit(int x) {a[x>>SHIFT] |= 1 << (x & MASK);}
- void clear_bit(int x) {a[x>>SHIFT] &= ~(1<<(x & MASK));}
- int test_bit(int x){return a[x>>SHIFT]&(1<<(x & MASK));}
- int main()
- {
- // int a[N/INT_BY_BIT+1];
- int i;
- for(i=0;i<N;i++)
- {
- clear_bit(i);
- }
- while (scanf("%d",&i) != EOF)
- {
- set_bit(i);
- }
- for(i=0;i<N;i++)
- {
- if(test_bit(i))
- {
- printf("%d",i);
- printf(" ");
- }
- }
- return 0;
- }
1,如果某个数字可能出现最多8次,应该如何用位图排序?
答:可以用一个字节来表示一个数
2,如果有10000000个数字,但是内存只有1M,而10000000需要1.25M,用过如何排序?
答:可以通过两趟排序完成,第一趟排序1到5000000,第二次排序5000000到10000000