位图法排序

来源:互联网 发布:网络打印机a3怎么设置 编辑:程序博客网 时间:2024/06/10 00:03

位图法:bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。

对unsigned没有重复的数字进行排序,假设我们要对0-7内的5个元素(4,7,2,5,3)排序。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0,如下图:

然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作:p+(i/8)|(0x01<<(i%8)当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位置为一(如下图):

接着再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:

最后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。

这样只需要开辟8个Bit(1Bytes)就可以记录每个数据并达到排序的目的。

先做个测试:

#include<iostream>#include<bitset>using namespace std;#define  i 1024int main(){bitset<i> bit;int a[i]={0};cout<<sizeof(bit)<<endl;cout<<sizeof(a)<<endl;system("pause");return 0;}


存储1024个数据,数组占用了4096个字节,而bitset只需要128个字节即可。

下面介绍位图法对不重复unsigned int 数的排序。

产生不重复unsigned int 数据请参考:产生数据

#include<iostream>#include<fstream>#include<bitset>#include<ctime>using namespace std;const unsigned int max_num=20000;//数字最大const unsigned int max_count=10000;//数据个数int main(){bitset<max_num+1> bit;int tmp=0;//以下读取磁盘文件中的数据ifstream in_ran;in_ran.open("F:\\gz\\random.txt",ios::in|ios::_Nocreate);if(in_ran.fail()){cout<<"打开文件失败!"<<endl;exit(1);}for(int i=0;i<max_count;i++){in_ran>>tmp;    //从文件中读取数据bit.set(tmp,1);//从磁盘文件读取100个整数,顺序存放在a数组中}in_ran.close();//以下向磁盘文件写入数据--排序后的数据ofstream out_sort;out_sort.open("F:\\gz\\random_sort.txt",ios::out);if(out_sort.fail()){cout<<"打开文件失败!"<<endl;exit(1);}for(int j=0;j<max_num;j++)//输出排序后的随机数{if(bit[j]==1){out_sort<<j<<" ";}}out_sort.close();system("pause");return 0;}

与以往排序:先将读取的数据储存在数组中,然后在进行排序相比,此排序方法没有中间数组作为传递,而且只须查询遍历一次数据即可得出排序后的结果。特别适用于无重复的整数排序。

1 0
原创粉丝点击