算法实验报告1Word文档格式.docx
- 文档编号:15332914
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:12
- 大小:138.28KB
算法实验报告1Word文档格式.docx
《算法实验报告1Word文档格式.docx》由会员分享,可在线阅读,更多相关《算法实验报告1Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
(1)PARTITION划分过程
(2)INSERTIONSORT插入分类过程
(3)INTERCHANGE交换过程
(4)SELECT2过程
实验要求
(1)编制测试数据,给出实验结果
(2)给出几个不同的数据集,并选择几个不同r值进行测试。
算法设计
整个算法的实验过程一共分为四个步骤:
(1)利用INSERTITION函数把A分为大小为r的[n/r]个子集和,忽略剩余元素。
(2)求[n/r]个子集和的中间值,并把它们重新设置成新的集合。
(3)调用PARTITION函数划分A集合
(4)递归调用求取出第K小元素。
实验环境
用C语言编程,CodeBlocks进行编译。
实验过程
源程序
#include<
stdio.h>
stdlib.h>
math.h>
intr=3;
intPARTITION(intp,intq,intA[])
{
inti,v,temp;
i=p+1;
q=q-1;
v=A[p];
while
(1)
{
for(;
A[i]<
v;
i++);
A[q]>
q--);
if(i<
q)
temp=A[i];
A[i]=A[q];
A[q]=temp;
}
else
break;
A[p]=A[q];
A[q]=v;
returnq;
}
INSERTCHANGE(int*a,int*b)
intt;
t=*a;
*a=*b;
*b=t;
voidINSERTIONSORT(intA[],intp,intq)
intitem,j,i;
for(j=p+1;
j<
=q;
j++)
item=A[j];
i=j-1;
while((i>
=p))
A[i+1]=A[i];
i=i-1;
A[i+1]=item;
intSEL(intA[],intm,intp,intk)
doublenrnr;
intn,i,j,nr;
if(p-m+1<
=r){INSERTIONSORT(A,m,p);
returnm+k-1;
n=p-m+1;
for(i=1;
i<
=(n/r);
i++){
INSERTIONSORT(A,m+(i-1)*r,m+i*r-1);
INSERTCHANGE(&
(A[m+i-1]),&
(A[m+(i-1)*r+r/2-1]));
nrnr=(double)(n/r);
nrnr=(nrnr+1.0000)/2.0000;
nr=ceil(nrnr);
j=SEL(A,m,m+n/r-1,nr);
(A[m]),&
(A[j]));
j=p+1;
j=PARTITION(m,j,A);
if(j-m+1==k)
returnj;
if(j-m+1>
k)
p=j-1;
else{
k=k-(j-m+1);
m=j+1;
intmain()
intA[]={0,6,2,1,3,4,6,7,8},i,k,n=9;
printf("
检测数据为:
"
);
for(k=0;
k<
n;
k++)
%d"
A[k]);
i=SEL(A,0,7,3);
\n第三小元素为:
%d\n"
A[i]);
最终排序为:
for(i=0;
=7;
i++)
%2d"
return0;
实验结果
A[]={0,6,2,1,3,4,6,7,8},可设置不用的R进行检测,输出的结果一致,且通过编译运行后,得到正常的排序为{0,1,2,3,4,5,6,7,8}。
如果r=6,运行结果为如图2-1所示:
图1-1
实验二
实验题目
单源最短路径问题:
已知一个n结点有向图G=(V,E)和边的权函数c(e),求由G中某指定结点v0到其它各结点的最短路径。
假定边的权值为正。
设计思路
应用贪心算法求解。
1)度量标准
生成的所有路径长度之和作为度量标准。
为了使这一量度达到最小,其单独的每一条路径都必须具有最小长度。
2)贪心算法
按照路径长度的非降次序生成这些路径。
首先,生成一条到最近结点的最短路径,然后,生成一条到第二近结点的最短路径,等等。
实验环境
程序源代码
#defineN1000
voidshortestPaths(intv,int*COST,int*DIST,intn);
//最短路径生成函数
intmin(intx,inty);
voidoutArray2(int*arr,introw,intcol);
//输出成本的邻接矩阵
voidoutArray1(int*arr,intn);
//输出更新后其它结点到起始结点的路径长度
intCOST[7][7]={
{0,20,50,30,N,N,N},
{N,0,25,N,N,70,N},
{N,N,0,40,25,50,N},
{N,N,N,0,55,N,N},
{N,N,N,N,0,10,70},
{N,N,N,N,N,0,50},
{N,N,N,N,N,N,0}
};
intDIST[7];
intv=0;
成本邻接矩阵:
\n"
outArray2(&
COST[0][0],7,7);
//生成0号结点到1至6号结点的最短路径
shortestPaths(v,&
COST[0][0],DIST,7);
voidshortestPaths(intv,int*COST,int*DIST,intn)
{//G是一个n结点有向图,它由其成本邻接矩阵COST[n][n]表示,DIST[j]被置以结点v到
//结点j的最短路径长度,这里1<
=j<
=n;
DIST[v]被置成0
intS[n];
intpre[n];
//p[w]记录起始结点到结点w的最短路径中的w前一结点
intu,num,i,w;
inttv,td=0;
//初始化:
结点v以外的结点未被选中,并更新路径长度为v到其它结点的初始成本
S[i]=0;
*(DIST+i)=*(COST+v*n+i);
pre[i]=0;
S[v]=1;
DIST[v]=0;
//更新路径长度
for(num=1;
num<
num++)
//选择距离结点v最近的结点w
for(w=1;
w<
w++)
if(S[w]==0)
td=DIST[w];
tv=w;
for(w++;
if(S[w]==0&
&
td>
DIST[w])
u=tv;
S[u]=1;
DIST[u]=td;
//更新路径
//DIST[w]=min(DIST[w],DIST[u]+*(COST+u*n+w));
if(DIST[w]>
(DIST[u]+*(COST+u*n+w)))
DIST[w]=(DIST[u]+*(COST+u*n+w));
pre[w]=u;
//更新结点w最短路径并记录w结点的上一结点
//输出第num次更新后的路径长度
\n第%d次更新:
num);
outArray1(DIST,n);
\n\n"
//输出路径
from0to%d,theshortestlengthis%3dthewayis:
i,DIST[i]);
w=i;
%d<
---"
w);
while(pre[w]!
=v)
w=pre[w];
v);
voidoutArray2(int*a,introw,intcol)
inti,j;
row;
for(j=0;
col;
if(*((a+i*row)+j)==N)
N\t"
%3d\t"
*((a+i*row)+j));
puts("
intmin(intx,inty)
returnx<
y?
x:
y;
voidoutArray1(int*arr,intn)
inti;
if(*(arr+i)==N)
*(arr+i));
运行演示
我用了书上的一个例子,它的成本邻接矩阵已直接存入程序中,它的带权有向图如下:
运行结果如下所示:
图2-1成本邻接矩阵
图2-2更新最短路径长度
图1-3最短路径
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)