位图算法的实现

位图算法数据的产生,共生成了80万个数据,排序大概花了仅仅800ms,鉴于位图算法的时间复杂度是线性增加的,故可以判定处理更大的数据也会有很好的性能


//产生数据的算法
#include 
#include
#include
#include
using namespace std;


std::vector s;
std::vectorres;
int n=100000000;

int main()
{
	//产生数据
	for (int i = 0; i < n; i++)
	{
		s.push_back(i);
	}
	//随机选取
	for(int i=0;i<0.7*n;i++)
	{
		int  a = ((int)((double)rand() / RAND_MAX * n)+rand())%s.size();
		res.push_back(s[a]);
		std::vector::iterator it = s.begin()+a;
		s.erase(it);
	}


	FILE *outFile = fopen("test.txt", "a");
	for (int i=0;i	{
		fprintf(outFile,"%d\n",res[i]);
	}
	fclose(outFile);
}


//数据排序的算法
#include
#include
#include
#include
#include
#include
using namespace std;


vector  nums;


//define of the bitMap
#define BITSPERWORDS 32                   //一个int数值的位数
#define SHIFT 5                                   //由于每一个int数有32位,左移5位即是除以32
#define MASK 0x1F                              //31
#define N 1000000                              //数据总量
int a[1+N/BITSPERWORDS];               

//设置位,|=进行位的异或,(i & MASK)相当于mod操作,然后对1进行左移余数位(最小0,最大31)的操作
void set(int i)
{
     a[i>>SHIFT] |= (1<<(i & MASK));
}
//清楚位,&=进行位的操作,~(1<<(i & MASK))是数值对应的位置为0 然后进行&操作,即可清零
void clr(int i)
{
     a[i>>SHIFT] &= ~(1<<(i & MASK));
}
//测试,测试对应的int里位的位置是否为1。
int test(int i)
{
     return a[i>>SHIFT] & (1<<(i & MASK));
}

int main()
{


fstream fin("test.txt");  //打开文件
    string ReadLine;
int a ;
    while(getline(fin,ReadLine))  //逐行读取,直到结束
    {
sscanf(ReadLine.c_str(),"%d",&a);
nums.push_back(a);
    } 
    fin.close();


clock_t start = clock();
for(int i=0;i


你可能感兴趣的:(算法与数据结构)