算法设计与分析实验(第2、3章)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
暨南大学本科实验报告专用纸
课程名称算法设计与分析成绩评定
实验项目名称分治策略与动态规划指导教师李展
实验项目编号01 实验项目类型设计类实验地点南海楼6楼学生姓名陈奕豪学号2012051351
学院信息科学技术学院系计算机系专业软件工程实验时间年月日
一、实验目的:
本实验涉及用分治策略和动态规划算法来求解优化组合问题。通过上机实验使学员学会程序的录入和调试;通过实验结果的比较,使学员了解两种算法的主要特点。
二、实验内容:
第二章实验题
必做——算法分析题1: 线性时间选择问题
●问题描述
给定线性序集中n个元素和一个整数k, 1≤k≤n, 要求找出这n个元素中第k小的元素
●主要思路及步骤
1.把a数组中元素分为5个一组,选每组中位数后分别将他们移向数
组头,再用同样的方法选取中位数的中位数x,然后按x把a数组分为两个划分,重复上述过程直至划分中元素个数少于75,返回要求值
●算法描述
Type Select(Type a[], int p, int r, int k)
{
if (r-p<75) {
用某个简单排序算法对数组a[p:r]排序;
return a[p+k-1];
};
for ( int i = 0; i<=(r-p-4)/5; i++ )
将a[p+5*i]至a[p+5*i+4]的第3小元素
与a[p+i]交换位置;
//找中位数的中位数,r-p-4即上面所说的n-5
Type x = Select(a, p, p+(r-p-4)/5, (r-p+6)/10);
int i=Partition(a,p,r, x),
j=i-p+1;
if (k<=j) return Select(a,p,i,k);
else return Select(a,i+1,r,k-j);
}
输入和输出
自行设计数组a的元素的值,要求元素个数不少于80个,并实现以下输出:(1)输出数组a中下标范围从p到p+(r-p-4)/5的元素;
(2)输出x的值,判断x是否为数组a中下标范围从p到p+(r-p-4)/5的拟中位数;
(3)输出数组a中下标范围从p到r的元素,验证其是否为以x为基准元素的划分。
源代码::
#include
#include
#include
void S *i,int *j){
int a;
a=*i;
*i=*j;
*j=a;
}//交换函数
int Partition(int *a, int p, int r){
int i=p,j=r+1;
int x=a[p];
while(true){
while(a[++i] while(a[--j]>x); if(i>=j) break; S[i],&a[j]); } a[p]=a[j]; a[j]=x; return j; } void QuickSort(int *a, int p, int r){ if(p int q=Partition(a,p,r); QuickSort(a,p,q-1); QuickSort(a,q+1,r); }//快速排列 int Partition_S(int *a, int p, int r, int x,int *count){ int i,j=p,temp,z=0; for(i=0;i<=r;i++){ if(a[i]!=x) z++; else{ temp=a[z]; a[z]=a[j]; a[j]=temp; j++; z++; (*count)++; } } i=p,j=r+1; while(true){ while(a[++i] while(a[--j]>x); if(i>=j) break; S[i],&a[j]); } a[p]=a[j]; a[j]=x; return j; }//划分函数 int Select(int *a, int p, int r, int k){ if(r-p<75){ QuickSort(a,p,r); return a[p+k-1]; } int i,j,t; for(i=0;i<=(r-p-4)/5;i++){ QuickSort(a,p+5*i,p+5*i+4); int temp=a[p+i]; a[p+i]=a[p+i*5+2]; a[p+i*5+2]=temp; } printf("数组a下标p到p+(r-p-4)/5的元素"); for(i=p;i<=p+(r-p-4)/5;i++) printf("%d ",a[i]);//输出(1) int x=Select(a,p,p+(r-p-4)/5,(r-p+6)/10); printf("\n拟中位数:%d\n",x);//输出(2) int count=0; i=Partition_S(a,p,r,x,&count); printf("以%d为基准的划分:",x); for(t=p;t<=r;t++) printf("%d ",a[t]);//输出(3) printf("\n\n"); j=i-p; if(k<=j) return Select(a,p,i-1,k); else if(count>=1 && j else return Select(a,i+count,r,k-j-count);