- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分治法算法分析作业
吴迪
2011-3-29
本次是第一次算法作业,该部分内容包含 3 个题目的程序代码,分析文档,说明图片等
内容
.
目录
引言 3
1 算法性能比较 3
1.1 问题分析 3
1.2 源程序代码 3
1.3 运行示例 8
1.4 数据分析 8
(单次录入数据具有较大随机误差,只看增长趋势) 8
2 循环赛问题 9
2.1 问题描述 9
2.2 问题分析 9
2.3 源程序 10
2.4 运行示例 11
3 最大最小值问题 12
3.1 问题描述与分析 12
3.2 源程序 13
3.3 运行示例 14
..
.
引言
任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。 问题的规模越小, 越容
易直接求解, 解题所需的计算时间也越少。 分治法是计算机科学中经常使用的一种算法。 设
计思想是, 将一个难以直接解决的大问题, 分割成一些规模较小的相同问题, 以便各个击破,
分而治之。 但是不是所有问题都适合用分治法解决。 当求解一个输入规模为 n 且取值又相当
大的问题时, 使用蛮力策略效率一般得不到保证。 因此分治策略将问题划分成 k 个子问题分别求解合并能有效提高计算效率。
1 算法性能比较
1.1 问题分析
比较插入排序,合并排序和快速排序性能。
算法性能比较通常是从时间复杂度的角度进行的。 排序算法的复杂度主要和算法中的比较次
数和元素交换或移动次数有关。 因而在不同大小规模的问题中通过统计这两者之和来评判算法的优劣。
同时也可以证明各种算法的时间复杂度与问题规模 n 之间的关系。
特别说明:本程序中考虑到不同规模的乱序数据输入过程比较复杂,编写了一个规模 n 的
整型数据随机排列函数,能够直接生成指定大小的 1-n 无序整数列。
1.2 源程序代码
// 2011 年 3 月 19 日 0:20:02
//main test.cpp for test
#includeiostream
#includetime.h
using namespace std;
// 全局标记比较次数和移动次数
int count_compare=0;
int count_move = 0;
int count_all(){
return count_compare+count_move;
}
void clear_count()
{
count_compare=0;
count_move = 0;
..
.
}
//insert sort
void insert_element(int a[],int size,int element) //size before insertion
{
int i=0;
for(i=size-1;i=0;i--)
{
count_compare++;
if(elementa[i]){ a[i+1]=a[i];count_move++;}
else break;
}
a[i+1]=element;
count_move++;
}
void InsertSort(int a[],int size)
{
for(int i=1;isize;i++)
{
insert_element(a,i,a[i]);
}
}
//merge sort
void Merge(int c[],int d[], int l, int m, int r)
{
int i = l, j = m+1, k = l;
while(i = m j = r)
{
count_compare++;
if(c[i] = c[j]){
d[k++]=c[i++];
count_move++;
}
else{ d[k++]=c[j++];count_move++;}
}
count_compare++;
if(i m)
{
for(int q = j; q = r; q ++){
d[k++] = c[q];
count_move++;
}
}
else
for(int q = i; q = m; q ++){
..
.
d[k++] = c[q];
count_move++;
}
}
void Copy(int a[],int b[],int l,int r)
{
for(int i=l;i=r;i++){
a[i]=b[i];
count_move++;
}
}
void MergeSort(int a[],int left,int right,int size)
{
if(left right)
{
count_compare++;
int i = (right + left)/ 2;
int p=size; //this is important,mind the value!
int *b=new in
原创力文档


文档评论(0)