昨天写了个程序,想了想应该可以改进一下,使其对负数也兼容,废话少说。附上代码:声明一下我这个程序的排序数据是利用随机生成函数随机生成的。
#include <iostream.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <iomanip.h>
#include <ctime>
#include <windows.h>
//#include <sys/time.h>
//#include <unistd.h>
int seed;
char *hmapbase; //记录位图的中间地址,以此为界限来映射正负整数
int signal; //记录生成随机数的符号
int map[8]={1,2,4,8,16,32,64,128};//单字节中8位用于1的映射
int Random()
{
//此函数用于生成随机的32位有符号整数
int result2,result1,result3;
result1=rand();
//cout<<setiosflags(ios::left)<<setw(15)<<result1;
result2=rand();
//cout<<setiosflags(ios::left)<<setw(15)<<result2;
result3=rand();
if(result3>16384)
result3=1;
else
result3=-1;
//cout<<setiosflags(ios::left)<<setw(15)<<result3;
signal=rand();
if(signal>16384)
signal=1;
else
signal=-1;
//cout<<setiosflags(ios::left)<<setw(15)<<signal;
return ((result1<<16)+(result2*2+result3));
}
void InPut_Map(char *mapbase,int size)
{
//用于数据的输入操作
int data;
int i;
char *p;
p=hmapbase;
srand((unsigned int)time(NULL));
for(i=0;i<size;i++)
{
srand(rand());
data=Random();
//cin>>data;
if(signal==1)
{
p+=data/8;
(*p)=(*p)|(map[data%8]);
p=hmapbase;
//Sleep(1000);
}
else
{
p-=(data/8+1);
(*p)=(*p)|(map[data%8]);
p=hmapbase;
}
}
}
void output(char * mapbase)
{
//输出数据
int i,j;
int count=0;
char *p=mapbase;
cout<<endl<<"After sorted,the number is:"<<endl;
for(i=0;i<0x1fffffff;i++)
{
for(j=0;j<8;j++)
{
if((p<hmapbase)&&(((*p)&(map[7-j]))!=0))
{
if(count%5==0)
cout<<endl;
cout<<setiosflags(ios::left)<<setw(15)<<(-1*(8*(0x0fffffff-i-1)+(7-j)));
count++;
}
if((p>=hmapbase)&&(((*p)&(map[j]))!=0))
{
if(count%5==0)
cout<<endl;
cout<<setiosflags(ios::left)<<setw(15)<<(8*(i-0x0fffffff)+j);
count++;
}
}
p++;
}
cout<<endl;
}
void main()
{
int size;
char *mapbase;
cout<<"Please input the number'size:";
cin>>size;
if(size>0)
{
if(!(mapbase=(char *)calloc(0x1fffffff,sizeof(char))))
{
cout<<"The memory is not enough"<<endl;
exit(0);
}
hmapbase=mapbase+0x0fffffff;//保存分配内存的中间地址
InPut_Map(mapbase,size);
}
else
{
cout<<"Size is invalided"<<endl;
exit(0);
}
output(mapbase);
free(mapbase);
}
注意:
对于32位有符号随机整数的生成我连用了四个rand()函数实现,其中一个用于生成符号,result1左移16位做随机数的高16位,而(result2*2)+result3来做随机数的低16位。目前还没有想出其他比较好的方法。
关于随机数种子选取问题,有人用srand((unsigned int)time(NULL))方法,但是此方法只能保证运行时间不同时得到的随机数不同,但不能保证在同一次程序运行时rand()的不同,因为此法是秒级的,如果两个rand()之间的代码运行时间超不过1秒的话,得到的结果是相同的。本人利用以下代码实现随机数生成
srand((unsigned int)time(NULL));
for(i=0;i<size;i++)
{
srand(rand());
data=Random();
这就保证了Random()能得到绝对的随机数(不管是同次运行还是不同次运行)。
对于变量范围,我也犯了不可饶恕在错误就是定义了一个全局变数signal以后又在Random()中定义了局部变量signal,从而造成对变量变化的追踪产生错误。
对于自定义的函数和变量尽量不要与编程用的语言中定义的相同,这会产生错误。