计算机算法设计与分析课程设计.docx

计算机算法设计与分析课程设计.docx

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

用分治法解决快速排序问题及用动态规划

法解决最优二叉搜索树问题及用回溯法解决图的着色问题

一、课程设计目的:

《计算机算法设计与分析》这门课程是一门实践性非常强的课程,要求我们能够将所学的算法应用到实际中,灵活解决实际问题。通过这次课程设计,能够培养我们独立思考、综合分析与动手的能力,并能加深对课堂所学理论和概念的理解,可以训练我们算法设计的思维和培养算法的分析能力。

二、课程设计内容:

1、分治法:

(2)快速排序;

2、动态规划:

(4)最优二叉搜索树;

3、回溯法:

(2)图的着色。

三、概要设计:

分治法—快速排序:

分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。分治法的条件:

(1)该问题的规模缩小到一定的程度就可以容易地解决;

(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;

(3)利用该问题分解出的子问题的解可以合并为该问题的解;

(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。抽象的讲,分治法有两个重要步骤:

将问题拆开;

将答案合并;

动态规划—最优二叉搜索树:

动态规划的基本思想是将问题分解为若干个小问题,解子问题,然后从子问题得到原问题的解。设计动态规划法的步骤:

找出最优解的性质,并刻画其结构特征;

递归地定义最优值(写出动态规划方程);

以自底向上的方式计算出最优值;

根据计算最优值时得到的信息,构造一个最优解。

回溯法—图的着色

回溯法的基本思想是确定了解空间的组织结构后,回溯法就是从开始节点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始节点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的或节点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前的扩展结点就成为死结点。换句话说,这个节点,这个结点不再是一个活结点。此时,应往回(回溯)移动至最近一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式递归的在解空间中搜索,直到找到所要求的解或解空间中以无活结点为止。

四、详细设计与实现:

分治法—快速排序

快速排序是基于分治策略的另一个排序算法。其基本思想是,对于输入的子数组a?p:r?,

按以下三个步骤进行排序:

、分解(divide)以元素a?p?为基准元素将a?p:r?划分为三段a?p:q?1?,a?q?和,a?q?1:r?使得a?p:q?1?中任何一个元素都小于a?q?,而a?q?1:r?中任何一个元素大于等于a?q?,下标在划分过程中确定。

、递归求解(conquer)通过递归调用快速排序算法分别对a?p:q?1?和a?q?1:r?

进行排序。

、合并(merge)由于a?p:q?1?和a?q?1:r?的排序都是在原位置进行的,所以不必进行任何合并操作就已经排好序了。

算法实现题: 现将数列{23 21 34 45 65 76 86 46 30 39 89 20 2 3

8 47 38 54 59 40}进行快速排序。源程序如下:

#includeiostreamusingnamespacestd;#definesize20

intpartition(intdata[],intp,intr)

{

intn=data[p],i=p+1,j=r,temp;

//将n的元素交换到左边区域

//将n的元素交换到右边区域while(true)

{

while(data[i]n)++i;while(data[j]n)--j;

if(i=j)

break;

temp=data[i]; data[i]=data[j]; data[j]=temp;

}

data[p]=data[j];data[j]=n;returnj;

}

void quick_sort(intdata[],intp,intr)

{if(p=r)return;

intq=partition(data,p,r);quick_sort(data,p,q-1);//对左半段排序quick_sort(data,q+1,r);//对右半段排序

}

intmain()

{

inti,n,data[size];

printf(请输入要排列的数目(=20):);scanf(%d,n);

printf(请输入要排列的数列:\n);for(i=0;in;++i)scanf(%d,data[i

文档评论(0)

hao187 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档