第一种最简单:利用STL的set容器
#include <set>
using namespace std;
class IntSet
{
public:
IntSet(int no, int maxval):no_(no), maxval_(maxval) {}
int size() {return s_.size();}
void generate()
{
while(s_.size() < no_)
{
s_.insert((rand() + 100)%maxval_);
}
}
void disp()
{
set<int>::const_iterator it;
for(it = s_.begin(); it != s_.end(); it++)
{
cout<<*it<<endl;
}
}
private:
set<int> s_;
int no_;
int maxval_;
};
int main()
{
IntSet iset(10, 100);
iset.generate();
iset.disp();
return 0;
}
第二种利用数组(因为要求输出的随机数是有序的)效率最低!
#include <memory>
#include <ctime>
using namespace std;
const int MAXVAL = 100;
void insert(int t, int*x, int n)
{
for(int i=0; i<=n; i++)
{
if(x[i] == MAXVAL)
break;
}
for(int j=0; j<=i; j++)
{
if(x[j] > t)
break;
}
for(int k=i; k>j; k--)
{
x[k+1] = x[k];
}
x[k] = t;
}
int main()
{
int* x = new int[10];
memset(x, MAXVAL, 40); // memset是逐个字节进行初始化
srand(time(NULL)); // 产生随机数种子,必须放在for循环的外面
for(int k=0; k<10; k++)
{
int val = rand()%MAXVAL;
cout<<val<<endl;
insert(val, x, 10);
}
cout<<"顺序输出如下:"<<endl;
for(int i=0; i<10; i++)
{
cout<<x[i]<<endl;
}
return 0;
}
第三种利用链表,消耗的存储空间较大,但时间效率高!
#include <ctime>
using namespace std;
struct node
{
int data;
node* link;
node(int val, node* p):data(val), link(p){}
};
class NodeList
{
public:
NodeList() {first_ = new node(100, NULL);}
void insert(node* p);
void disp();
private:
node* first_;
};
void NodeList::insert(node* p)
{
node* tmp = first_;
// 下面的判断条件需格外注意小心:如果是第一次插入
// 或者插入元素小于第一个节点的值,则在第一个位置插入新元素
if(tmp->link == NULL || (tmp->data > p->data))
{
p->link = tmp;
first_ = p;
}
else
{
while(tmp->link != NULL)
{
if(tmp->link->data > p->data)
{
p->link = tmp->link;
tmp->link = p;
break;
}
else
{
tmp = tmp->link;
}
}
}
}
void NodeList::disp()
{
node* tmp = first_;
while(tmp != NULL)
{
cout<<tmp->data<<endl;
tmp = tmp->link;
}
}
int main()
{
NodeList nl;
// 产生随机数种子,必须放在for循环的外面
srand(time(NULL));
for(int k=0; k<10; k++)
{
int val = rand()%100;
cout<<val<<endl;
node* tmpnode = new node(val, 0);
nl.insert(tmpnode);
}
cout<<"链表排序后的随机数输出为:"<<endl;
nl.disp();
return 0;
}
2009、2、16 hekex1n