生成[0 maxval]范围内m个整数的随机有序序列.

1,借助于容器set实现.

#include <iostream>
#include <set>
#include <ctime>
using namespace std ;

class IntSetSTL
{
public:
IntSetSTL(int max,int num){}
int size(){ return S.size(); }
void insert(int t){ S.insert(t); }
void report(int* v)
{
int i=0;
for(set<int>::iterator ite=S.begin();ite!=S.end();ite++)
v[i++]=*ite;
}
private:
set<int> S;
};

void generateSetSTL(int m,int maxVal)
{
int* v=new int[m];
IntSetSTL stl(maxVal,m);
while(stl.size()<m)
stl.insert(rand()%(1+maxVal));
stl.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;

}

int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetSTL(m,maxVal);
return 0 ;
}


2,用数组实现

#include <iostream>
#include <ctime>
using namespace std ;

class IntSetArray
{
public:
IntSetArray(int maxVal,int m)
{
a=new int[m+1];
//设置一个哨兵
n=0;
a[0]=maxVal;
}
int size(){ return n; }
void insert(int t)
{
int i;
for(i=0;a[i]<t;i++)
;
if(a[i]==t)
return;
for(int j=size();j>=i;j--)
a[j+1]=a[j];
a[i]=t;
n++;
}
void report(int* v)
{
for(int i=0;i<size();i++)
v[i]=a[i];
}
private:
int* a;
int n;
};

void generateSetArray(int m,int maxVal)
{
int* v=new int[m];
IntSetArray array(maxVal,m);
while(array.size()<m)
array.insert(rand()%maxVal);
array.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;

}

int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetArray(m,maxVal);
return 0 ;
}

3,用链表实现


#include <iostream>
#include <ctime>
using namespace std ;

struct Node
{
Node(int i,Node* p):val(i),next(p){}
int val;
Node* next;
};

class IntSetList
{
public:
IntSetList(int maxVal,int m)
{
sentinel=head=new Node(maxVal,NULL);
n=0;
}
int size(){ return n; }
void insert(int t)
{
head=rinsert(head,t);
}
void report(int* v)
{
int i=0;
for(Node* p=head;p!=sentinel;p=p->next)
v[i++]=p->val;
}
private:
//这里nb的递归
Node* rinsert(Node* p,int t)
{
if( t>(p->val) )
p->next=rinsert(p->next,t);
else if( t<(p->val) )
{
p=new Node(t,p);
n++;
}
return p;
}
Node* head;
//哨兵节点
Node* sentinel;
int n;
};

void generateSetList(int m,int maxVal)
{
int* v=new int[m];
IntSetList list(maxVal,m);
while(list.size()<m)
list.insert(rand()%maxVal);
list.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;

}

int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetList(m,maxVal);
return 0 ;
}

4,用二叉搜索树实现


#include <iostream>
#include <ctime>
using namespace std ;

struct Node
{
Node(int i):val(i),lchild(NULL),rchild(NULL){}
int val;
Node* lchild;
Node* rchild;
};

class IntSetBST
{
public:
IntSetBST(int maxVal,int m):root(NULL),n(0){}
int size(){ return n; }
void insert(int t)
{
root=rinsert(root,t);
}
void report(int* x)
{
v=x;
vn=0;
traverse(root);
}
private:
//这里nb的递归
Node* rinsert(Node* p,int t)
{
if(p==NULL)
{
p=new Node(t);
n++;
}
else if( t>(p->val) )
{
p->rchild=rinsert(p->rchild,t);
}
else if( t<(p->val) )
{
p->lchild=rinsert(p->lchild,t);
}
return p;
}
void traverse(Node* p)
{
if(p==NULL)
return;
traverse(p->lchild);
v[vn++]=p->val;
traverse(p->rchild);
}
Node* root;
int n;
int *v,vn;
};

void generateSetBST(int m,int maxVal)
{
int* v=new int[m];
IntSetBST bst(maxVal,m);
while(bst.size()<m)
bst.insert(rand()%maxVal);
bst.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;

}

int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetBST(m,maxVal);
return 0 ;
}


5,用比特位向量实现.

#include <iostream>
#include <ctime>
using namespace std ;

class IntSetBitVector
{
public:
IntSetBitVector(int maxVal,int m):hi(maxVal),n(0),x(new int[maxVal/BITSPERWORD+1])
{
for(int i=0;i<hi;i++)
clear(i);
}
int size(){ return n; }
void insert(int t)
{
if(!test(t))
{
set(t);
n++;
}
}
void report(int* v)
{
int j=0;
for(int i=0;i<hi;i++)
{
if(test(i))
v[j++]=i;
}
}
private:
enum{ BITSPERWORD=32, SHIFT=5, MASK=0x1f};
void set(int i)
{
x[i>>SHIFT]|=(1<<(i&MASK));
}
void clear(int i)
{
x[i>>SHIFT]&=~( 1<<(i&MASK) );
}
int test(int i)
{
return x[i>>SHIFT]&(1<<(i&MASK));
}

int n,hi;
int* x;
};

void generateSetBitVector(int m,int maxVal)
{
int* v=new int[m];
IntSetBitVector bitVector(maxVal,m);
while(bitVector.size()<m)
bitVector.insert(rand()%maxVal);
bitVector.report(v);
for(int i=0;i<m;i++)
cout<<v[i]<<endl;
cout<<endl;
delete[] v;

}

int main ()
{
srand(time(0));
const int maxVal=100;
const int m=10;
generateSetBitVector(m,maxVal);
return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基数排序的C代码实现,同时包含了随机生成n个数据的函数: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_NUM 10000 // 随机数的范围 #define MAX_DIGIT 4 // 最大位数 // 获取num的第exp位数字 int getDigit(int num, int exp) { return (num / exp) % 10; } // 基数排序 void radixSort(int arr[], int n) { int exp = 1; // 位数 int maxVal = arr[0]; // 数组中的最大值 int i, j, k; // 获取数组中的最大值 for (i = 1; i < n; i++) { if (arr[i] > maxVal) { maxVal = arr[i]; } } // 从最低位到最高位循环排序 while (maxVal / exp > 0) { int bucket[10][n]; // 桶 int bucketCnt[10] = {0}; // 每个桶中元素的个数 // 将元素放入桶中 for (i = 0; i < n; i++) { int digit = getDigit(arr[i], exp); bucket[digit][bucketCnt[digit]++] = arr[i]; } // 将桶中元素按顺序放回数组 k = 0; for (i = 0; i < 10; i++) { for (j = 0; j < bucketCnt[i]; j++) { arr[k++] = bucket[i][j]; } } exp *= 10; // 处理下一位 } } // 随机生成n个数据 void generateRandomData(int arr[], int n) { int i; srand(time(NULL)); // 设置随机数种子 for (i = 0; i < n; i++) { arr[i] = rand() % MAX_NUM; } } // 输出数组 void printArray(int arr[], int n) { int i; for (i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int n = 10; // 数据个数 int arr[n]; // 存储数据的数组 // 随机生成数据 generateRandomData(arr, n); printf("Original data:\n"); printArray(arr, n); // 基数排序 radixSort(arr, n); printf("Sorted data:\n"); printArray(arr, n); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值