使用位图法判断整形数组是否存在重复并排序
输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10,000,000 输入文件中没有重复的整数,没有其他数据与该整数相关联。
输出: 按升序排列这些数,并输入重复的元素
约束:有 1MB多(不超过2MB) 的内存空间可用,有充足的硬盘空间
#include <stdio.h>
#define MAX 10000000
#define SHIFT 5
#define MASK 0x1F
#define D 32
int a[1+MAX/D];
void set(int n) //将逻辑位置为n的二进制位置为1
{
//if(a[n>>SHIFT]&(1<<(n&MASK)))
if(a[n/D]&(1<<(n%D))) <span style="font-family: Arial, Helvetica, sans-serif;">//如果已经为1,则输出重复元素</span>
{
printf("重复元素:%d\n",n);
}
else
//a[n>>SHIFT] |=(1<<(n&MASK)); //n>>SHIFT右移5位相当于除以32求算字节位置,n&MASK相当于对32取余即求位位置,
a[n/D] |= (1<<(n%D));
}
void clear(int n)
{
a[n/D] &= (0<<(n%D)); //将逻辑位置为n的二进制位置为0
}
int test(int n)
{
return a[n/D] & (1<<(n%D)); //测试逻辑位置为n的二进制位是否为1
}
int main()
{
int i,n;
int arr[] = {2,21,3,21,43,23,22,5};
int len = sizeof(arr)/(sizeof(arr[0]));
for(i=1;i<=MAX;i++)
{
clear(i);
}
for(i=0;i<len;i++)
{
set(arr[i]);
}
for(i=1;i<=MAX;i++)
{
if(test(i))
printf("%d ",i);
}
return 0;
}