算法实验报告——线性时间选择问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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小元素是"<