位图法排序

位图法: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 1024

int 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值