《计算机算法设与分析》.docVIP

  • 3
  • 0
  • 约1.08万字
  • 约 18页
  • 2016-10-18 发布于贵州
  • 举报
《计算机算法设与分析》

用分治法解决快速排序问题及用回溯法解决0-1背包问题 课程设计目的: 《计算机算法设计与分析》这门课程是一门实践性非常强的课程,要求我们能够将所学的算法应用到实际中,灵活解决实际问题。通过这次课程设计,能够培养我们独立思考、综合分析与动手的能力,并能加深对课堂所学理论和概念的理解,可以训练我们算法设计的思维和培养算法的分析能力。 二、课程设计内容: 1、分治法: (2)快速排序; 、回溯法: (2)图的着色。 ,按以下三个步骤进行排序: (1)、分解(divide) 以元素为基准元素将划分为三段,和,使得中任何一个元素都小于,而中任何一个元素大于等于,下标在划分过程中确定。 (2)、递归求解(conquer) 通过递归调用快速排序算法分别对和进行排序。 (3)、合并(merge) 由于和的排序都是在原位置进行的,所以不必进行任何合并操作就已经排好序了。 算法实现题: 现将数列{12 21 31 45 36 76 66 46 30 7 89 20 2 5 99 47 23 54 51 73}进行快速排序。 源程序如下: #include iostream using namespace std; #define size 20 int partition(int data[],int p,int r) { int n=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; return j; } void quick_sort(int data[],int p,int r) { if(p=r) return; int q=partition(data,p,r); quick_sort(data,p,q-1); //对左半段排序 quick_sort(data,q+1,r); //对右半段排序 } int main() { int i,n,data[size]; printf(请输入要排列的数目(=20):); scanf(%d,n); printf(请输入要排列的数列:\n); for(i=0;in;++i) scanf(%d,data[i]); quick_sort(data,0,n-1); printf(排列后的数列为:\n); for(i=0;in;++i) printf( %d ,data[i]); printf(\n); return 0; } 运行结果如下: 图1 图5 回溯法—0-1背包问题 回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。? 二、算法框架:? 1、问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应到少包含问题的一个(最优)解。? 2、回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的扩展结点处

文档评论(0)

1亿VIP精品文档

相关文档