您所在位置: 网站首页 / 计算机算法设计与分析实验报告.doc / 文档详情
计算机算法设计与分析实验报告.doc 立即下载
2025-01-15
约1.4万字
约24页
0
489KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

计算机算法设计与分析实验报告.doc

计算机算法设计与分析实验报告.doc

预览

免费试读已结束,剩余 19 页请下载文档后查看

10 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开


华北电力大学
实验报告
|
|






实验名称算法设计实验
课程名称算法设计与分析
|
|
专业班级:信安1301学生姓名:
学号:成绩:
指导教师:胡朝举实验日期:2015年11月

实验一、归并排序(MergingSort)——分治策略
实验内容
归并排序是一个非常优秀的排序方法,也是典型的分治策略的典型应用。实验要求:
(1)编写一个模板函数:
template<typenameT>
MergeSort(T*a,intn);
以及相应的一系列函数,采用分治策略,对任意具有:
booloperator<(constT&x,constT&y);
比较运算符的类型进行排序。
与STL库中的函数std::sort(..)进行运行时间上的比较,给出比较结果,如:动态生成100万个随机生成的附点数序列的排序列问题,给出所用的时间比较。
归并排序就是将两个或两个以上的有序表合并成一个有序表的过程。将两个有序表合并成一个有序表的过程称为2-路归并。
二、主要思想
假设初始序列含有n个记录,则可看成n个有序的子序列,每个字序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,...,如此重复,直到一个长度为n的有序序列为止。
例已知待排序记录的关键字序列为{49,38,65,97,76,13,27},给出2-路归并排序法进行排序的过程

2-路归并排序中的核心操作是,将待排序序列中前后相邻的两个有序序列归并为一个有序序列。相邻两个有序子序列的归并
设两个有序表存放在同一数组中相邻的位置上:R[low..mid]和R[mid+1..high],每次分被从两个表中取出一个记录进行关键字的比较,将较小者放入T[low..high]中,重复此过程,直至其中一个表为空,最后将另一非空表中余下的部分直接复制到T中。
实验结果
算法分析
1)时间复杂度当有n个记录时,需进行[log2n]趟归并排序,每一趟归并,其关键字比较次数不超过n,元素移动次数都是n,因此,归并排序的时间复杂度为O(nlog2n)。2)空间复杂度用顺序表实现归并排序时,需要和待排序记录个数相等的辅助存储空间,所以空间复杂度为O(n);
实验代码
#include<iostream.h>
#include<algorithm>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
usingnamespacestd;
template<classType>
voidMergSort(Typea[],intn){
	Type*b=newType[n];
	ints=1;
	while(s<n){
		MergPass(a,b,s,n);
		s+=s;
		MergPass(b,a,s,n);
		s+=s;
	}
}
template<classType>
voidMergPass(Typex[],Typey[],ints,intn)
{
	inti=0;
	while(i<=n-2*s)
	{
		Merg(x,y,i,i+s-1,i+2*s-1);
		i=i+2*s;

	}
	if(i+s<n)
		Merg(x,y,i,i+s-1,n-1);
	else{//如果剩下的不够i+s,则把剩下的放入y中
		for(intj=i;j<=n-1;j++){
			y[j]=x[j];
		}
	}
}
template<classType>
voidMerg(Typec[],Typed[],intl,intm,intr){
	inti=l,j=m+1,k=l;
	while((i<=m)&&(j<=r)){
		if(c[i]<=c[j])
			d[k++]=c[i++];
		else
			d[k++]=c[j++];

	}
	if(i>m)
	for(intq=j;q<=r;q++)
		d[k++]=c[q];
	else
	for(intq=i;q<=m;q++)
		d[k++]=c[q];
}

floatrandf(floatbase,floatup){
	
return(rand()%(int)((up-base)*RAND_MAX))/(float)RAND_MAX;//产生随机数
}
voidprintArray(float*a,intN){
	for(inti=0;i<=N;i++){
		cout<<a[i]<<endl;
	}
}

voidmain(){
	intArrayLen=5;
	float*array=newfloat[ArrayLen];
	float*arrays=newfloat[ArrayLen];
	floatmn,ene;
	pri
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

计算机算法设计与分析实验报告

文档大小:489KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用