VC 6.0位图排序第二个版本

本文介绍了一种改进后的排序程序,该程序能够处理包括负数在内的32位有符号整数。通过使用随机数生成函数,实现了数据的随机输入,并通过特定的数据结构进行排序输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      昨天写了个程序,想了想应该可以改进一下,使其对负数也兼容,废话少说。附上代码:声明一下我这个程序的排序数据是利用随机生成函数随机生成的。

#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,从而造成对变量变化的追踪产生错误。

       对于自定义的函数和变量尽量不要与编程用的语言中定义的相同,这会产生错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值