Sherwood型线性时间选择算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析与设计实验报告
第 8 次实验
}
说明:output文件中第一组结果为手动输入验证正确与否的测试数据,其他几组为随机生成数据的结果。
input文件中输入的是手动输入的数据。
附录:完整代码
//RandomNumber.h
#include
#include
using namespace std;
const unsigned long maxshort = 65535L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
class RandomNumber{
private:
// 当前种子
unsigned long randSeed;
public:
// 构造函数,默认值0表示由系统自动产生种子
RandomNumber(unsigned long s = 0);
// 产生0 ~ n-1之间的随机整数
unsigned short Random(unsigned long n);
// 产生[0, 1) 之间的随机实数
double fRandom();
};
// 产生种子
RandomNumber::RandomNumber(unsigned long s)
{
if (s == 0)
randSeed = time(0); //用系统时间产生种子else
randSeed = s;
}
// 产生0 ~ n-1 之间的随机整数
unsigned short RandomNumber::Random(unsigned long n) {
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n); }
// 产生[0, 1)之间的随机实数
double RandomNumber::fRandom()
{
return Random(maxshort) / double(maxshort);
}
//源.cpp
#include "RandomNumber.h"
#include
#include
#include
#include
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
template
inline void Swap(Type &a,Type &b)
{
Type temp = a;
a = b;
b = temp;
}
//计算a[l:r]中第k小元素
template
Type select(Type a[],int l,int r,int k)
{
static RandomNumber rnd;
while(true)
{
if(l>=r)
{
return a[l];
}
int i = l,
j = l + rnd.Random(r-l+1);//随机选择划分基准 Swap(a[i],a[j]);
j = r+1;
Type pivot = a[l];
//以划分基准为轴做元素交换
while(true)
{
while(a[++i] while(a[--j]>pivot); if(i>=j) { break; } Swap(a[i],a[j]); } if(j-l+1 == k)//第k小 { return pivot; } //a[j]必然小于pivot,做最后一次交换,满足左侧比pivot小,右侧比pivot大 a[l] = a[j]; a[j] = pivot; //对子数组重复划分过程 if(j-l+1 { k = k-j+l-1;//右侧:k-(j-l+1)=k-j+l-1 l = j + 1; } else { r = j - 1; } } } //计算a[0:n-1]中第k小元素 //假设a[n]是一个键值无穷大的元素 template Type select(Type a[],int n,int k) { if(k<1 || k>n) { cout<<"请输入正确的k!"< return 0; } return select(a,0,n-1,k); } void test1() { int n; in>>n; out << "测试数据:" << endl; int a[n]; out << "原数组为:" << endl; for (int i = 0; i<9; i++) { in >> a[i] ; out< } out << endl;