Sherwood型线性时间选择算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档