位图排序时间复杂度可达O(n)

来源:互联网 发布:淘宝复制链接在哪里 编辑:程序博客网 时间:2024/06/05 17:58
位图排序就是使用一张表来记录关键字的存在状态(存在或不存在),然后通过采集到的状态(在/不在)通过一次遍历来确定序列顺序。
­
假设有一个待排序序列
5,4,8,9,15,10,12,13
假设表中可记录1024位,那么表中的内容就是(索引用0开始)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 0 0 1 1 0 0 1 1 1  0  1  1  0  1  (后面全0) (这是表中实在内容)
那么通过一次待排序数组则可将关键字信息记录在表中,
通过一次遍历表则可以确定关键字序列.
­
一些不能不说的话:
1.申明一个数组
  如:int a[10]
  则 a[10]可以纪录10*32=320位的表.
  如果用一个整型来存储一个位如果数据过大,这是行不通的.
  int A[30亿],操作系统一般不可能分配那么大的连续空间的.
2.位排序也有很大局限性,表现如下:第一,待排关键字一般为非负数;第二,关键字不重复;  第三,关键字比较密集才比较适合用位图排序.如一个城市的电话号码.
3.位图排序大体上是以牺牲空间复杂度来赢得时间复杂度的.
  但在位图表与索引对应中却以牺牲时间复杂度来赢得空间复杂度的.
­
排序C++语言程序如下:
#include "stdio.h"
#include "iostream.h"
#define bitperword 32
#define shift 5
#define mask 0x1f
#define N 1000000000
int a[1+N/bitperword];
void setbit(int i)
{
int index=i/32;
int d=1<<(i%32);
a[index]=a[index]|d;
}
void clrbit(int i)
{
//a[i>>shift]&=~(1<<(i&mask));
int index=i/32;
int d=1<<(i%32);
a[index]=a[index]&~d;
}
int testbit(int i)
{
return a[i>>shift]&(1<<(i&mask));
}
void main()
{
int i,j=0,o;
int putput[8];
int a[]={5,4,8,9,15,10,12,13};
int nCount=8;
int max=30;
for(i=0;i<30;i++)clrbit(i);
for(i=0;i<8;i++)
setbit(a[i]);
for(i=0;i<max,i++)
{
if(testbit(i)!=0)
{
  output[j]=i;
  j++;
}
}
for(i=0;i<8;i++)
printf("%d ",output[i]);
}
­
­

#define bitperword 32
#define shift 5
#define mask 0x1f
#define N 1000000000
int a[1+N/bitperword];
void setbit(int i)
{
int index=i/32;
int d=1<<(i%32);
a[index]=a[index]|d;
}
void clrbit(int i)
{
int index=i/32;
int d=1<<(i%32);
a[index]=a[index]&~d;
}
int testbit(int i)
{return a[i>>shift]&(1<<(i&mask));}