中南大学算法实验报告综述.docx

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

算法分析与设计 实验报告 学 院: 信息科学与工程学院 专业班级:  i got7 指导老师:      学 号:    i got7 姓 名:     鸟宝宝 a. 合并排序 合并排序是分治法的应用,把需要排序的数组A[1 - n],一分为二A[1 -n/2]和A[n/2+1 - n],然后在对每一个子数组递归排序,接着再把这两个子数组合并成一个有序的数组。 算法描述: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置 第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针超出序列尾,将另一序列剩下的所有元素直接复制到合并序列尾 关键代码: private static void Sort(int[] a, int left, int right) { if(left=right) return; int mid = (left + right) / 2; Sort(a, left, mid); Sort(a, mid + 1, right); merge(a, left, mid, right); } private static void merge(int[] a, int left, int mid, int right) { int[] tmp = new int[a.length]; int r1 = mid + 1; int tIndex = left; int cIndex=left; // 逐个归并 while(left =mid r1 = right) { if (a[left] = a[r1]) tmp[tIndex++] = a[left++]; else tmp[tIndex++] = a[r1++]; } // 将左边剩余的归并 while (left =mid) { tmp[tIndex++] = a[left++]; } // 将右边剩余的归并 while ( r1 = right ) { tmp[tIndex++] = a[r1++]; } System.out.print( 第+(++number)+次排序: ); //从临时数组拷贝到原数组 while(cIndex=right){ a[cIndex]=tmp[cIndex]; //输出中间归并排序结果 System.out.print(a[cIndex]+ ); cIndex++; } System.out.println(); } 运行结果截屏: 算法分析:合并排序满足分治法的基本公式 T(n)=2T(n/2)+f(n) 其中2T(n/2)是2个子问题求解,即对两个子数组排序; 而f(n)是将子问题合起来求原始问题的解的代价,即将两个有序的子数组合并为一个有序的数组。在最终的合并阶段,键值的比较的代价,在最坏的情况下是n-1 ,(比如每个数组的第i号轮流被放入数组),根据主定理,T(n)=O(nlogn)。 b. 0-1背包问题 问题描述:在0 / 1背包问题中,需对容量为W 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品j 的重量为wj ,价值为vi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。 有3中方法可解: 动态规划法: 递推式: K(w,

您可能关注的文档

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档