算法实验报告——线性时间选择问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五线性时间选择问题

年级 16 学号 20161101072 姓名陈飞宇成绩

专业信息安全实验地点 C1-413 指导教师陈丽萍实验日期

一、实验目的

1、理解分治法的基本思想

2、掌握分治法解决问题的基本步骤,并能进行分治算法时间空间复杂度分析。

二、实验内容

线性时间选择问题:给定线性序集中n个元素和一个整数k(k>=1而且k<=n),要求在线性时间内找出这n个元素中第k小的元素。

1.随机快速排序

2.利用中位数线性时间选择

三、算法描述

1.随机快速排序

在算法Randomized_Select中执行Randomized_Partition,将数组分成两个子数组,在Randomized_Partition中调用Partition函数确定一个基准元素,对数组进行划分。由于划分是随机产生的,由此导致算法Randomized_Select也是一个随机化算法。

2.利用中位数线性时间选择

四、程序

1.随机快速排序

#include

#include

#include

int Randomized_Select(int a[],int p,int r,int i);

int Randomized_Partition(int a[],int p,int r);

int Partition(int a[],int p,int r);

void swap(int *a,int *b);

int Random(int p,int q);

int main()

{

int a[] = {10,9,8,7,6,5,4,3,2,1};

int i = 3;

printf("第%d小的数是:\n%d",i,Randomized_Select(a,0,9,i)); return 0;

}

void swap(int *a,int *b)

{

int temp;

temp = *a;

*a = *b;

*b = temp;

}

int Random(int p,int q)//产生p和q之间的一个随机整数

{

int i,number;

srand((unsigned)time(NULL));

number = rand()%(q-p+1)+p;

return number;

}

int Partition(int a[],int p,int r)//快排的部分

{

int x = a[r];

int i = p- 1;

int j;

for(j = p;j<=r-1;j++)

{

if(a[j] <= x)

{

i = i + 1;

swap(&a[j],&a[i]);

}

}

swap(&a[i+1],&a[r]);

return i+1;

}

int Randomized_Partition(int a[],int p,int r)//随机交换数字{

int i = Random(p,r);

swap(&a[r],&a[i]);

return Partition(a,p,r);

}

int Randomized_Select(int a[],int p,int r,int i)//选择算法核心

{

if(p == r) return a[p];

int q = Randomized_Partition(a,p,r);

int k = q - p + 1;

if(i == k)//如果刚好等于i,输出

return a[q];

else if(i < k)//如果i比k小,证明要找的元素在低区

return Randomized_Select(a,p,q-1,i);

else //找的元素在高区

return Randomized_Select(a,q+1,r,i-k); //因为a[q]已经是前面第k个小的,所以在后面就是i-k小

}

2. 利用中位数线性时间选择

#include

#include

#include

#include

using namespace std;

template

void Swap(Type &x,Type &y);

inline int Random(int x, int y);

template

void BubbleSort(Type a[],int p,int r);

template

int Partition(Type a[],int p,int r,Type x);

template

Type Select(Type a[],int p,int r,int k);

int main()

{

//初始化数组

int a[10];

//必须放在循环体外面

srand((unsigned)time(0));

for(int i=0; i<10; i++)

{

a[i] = Random(0,50);

cout<<"a["<

}

cout<

cout<<"第3小元素是"<

//重新排序,对比结果

BubbleSort(a,0,9);

for(int i=0; i<10; i++)

{

cout<<"a["<

}

cout<

}

template

void Swap(Type &x,Type &y)

{

Type temp = x;

x = y;

y = temp;

}

inline int Random(int x, int y)

{

int ran_num = rand() % (y - x) + x;

相关文档
最新文档