已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,1,第五章算法与数据结构,程序是建立在数据结构基础上使用计算机语言描述的算法,因此简单地讲,程序也可以表示成:算法数据结构。介绍算法的概念及常用算法。并通过数组、链表、栈、队列等数据结构以及Java对象容器,讨论算法的应用及算法的Java程序实现。,.,2,5.1算法,算法是为了求解某一问题在有限步骤内、定义了具体操作序列的规则集合。一个算法应该具有以下五个重要的特征:确切性(Noambiguity)算法的每一步骤必须有确切的定义。而不应该有二义性,例如,在算法中不能出现诸如“赋值为100或1000”。输入(Input)有0个或多个输入,用于初始化运算对象。所谓0个输入是指无需输入条件,而算法本身定出了初始条件。输出(Output)没有输出的算法是毫无意义的。一个算法应该有一个或多个输出,以反映对输入数据加工后的结果。可行性(Feasibility)算法原则上能够精确地运行,而且对于算法中的每种运算,在原理上人们应该能用笔和纸做有限次运算后完成。有穷性(Finite)算法必须保证执行有限步之后结束。只具有前面四个特征的规则集合,称不上算法。例如,尽管操作系统能完成很多任务,但是它的计算过程并不终止,而是无穷无尽的执行、等待执行,所以操作系统不是算法。,.,3,5.1.1算法的描述,1、伪代码描述:伪代码(Pseudo-code)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(如Pascal、C、Java等)实现。因此,伪代码必须结构清晰,代码简单,可读性好,并且类似自然语言。,伪代码描述的算法:1.x02.y03.z04.whilex1004.1doxx+14.2yx+y4.3fort0to104.3.1doz(z+x*y)/1004.3.2repeatyy+zz-y4.3.3.untilz04.4.zx*y5.yy/2,Java代码实现:intx=0;inty=0;intz=0;while(x100)x=x+1;y=x+y;for(intt=0,t=10,t+)z=(z+x*y)/100;doy=y+1;z=z-y;while(z0);z=x*y;y=y/2;,.,4,5.1.1算法的描述,2、图形描述:程序设计中,能够用来表示算法基本概念的图主要有:PAD图、NS盒图、流程图。,程序流程图常用图形符号及控制结构图例,.,5,5.1.2常用算法,基本算法大都比较简单,是其他算法的基础。这类算法在程序中应用非常普遍,如:累加求和、累乘求积、求最大和最小值等。,从10个数中求最大值算法的例子,伪代码描述算法:FindLargestInput:10positiveintegers1.largest02.counter03.while(counterlargest)then3.2.1largesttheIntegerendif3.3countercounter+1endwhile4.ReturnlargestEnd,Java语言实现:importjava.io.*;publicclassMaxpublicstaticvoidmain(Stringargs)throwsIOException/初始化BufferedReaderinput=newBufferedReader(newInputStreamReader(System.in);intlargest=0;intcounter=0;inttheInteger=0;/循环比较while(counterlargest)largest=theInteger;/whileSystem.out.println(求出最大数是:+largest);,.,6,5.1.2常用算法,排序算法根据数据的值对它们进行排列。排序是为了把不规则的信息进行整理,以提高查找效率。常用的排序方法包括:选择排序、冒泡排序、插入排序、快速排序、合并排序、希尔排序、堆排序等。查找是一种在列表中确定目标所在位置的算法。基本的查找方法有顺序查找和折半查找。迭代和递归是用于编写解决问题的算法的两种途径。迭代就是反复替换的意思,它通过使用一个中间变量保存中间结果,不断反复计算求解最终值。递归是一个算法自我调用的过程,用递归调用的算法就是递归算法。,阶乘迭代算法伪代码:FactorialInput:Apositiveintegernum1.FactN12.i13.While(ior=num)3.1FactNFactNi3.2IncrementiendwhileReturnFactNend,阶乘递归算法伪代码:FactorialInput:Apositiveintegernum1.if(num=0)then1.1Return1else1.2returnnumFactorial(num-1)endifend,.,7,5.2数组,数组用于表示相同类型的元素的有序集合,数组中每个元素都有一个唯一的索引。根据数组的分配方式可将数组分为:一维数组和多维数组。Java中还可以定义不规则数组。我们可以把一维以上的数组看作是“数组的数组”。,.,8,5.2.1数组的创建和使用,数组是一个被命名的连续存储区域的集合,存放着相同类型的数据项。数组的每个元素通过它在数组里的位置索引来引用。数组索引必须是一个整数值或者一个整数表达式。在Java里,大多数情况下数组被当成对象来对待。它们是用new操作符来实例化的,有自己的实例变量(例如length,可返回数组中第一维的元素数量)。数组变量是引用类型的变量。定义与创建一个数组的语法及例子。,定义与创建一个数组的语法:数组类型名称数组变量名;/定义数组变量(也可以写成:数组类型名称数组变量名;/定义数组变量)数组变量名=new数组类型名称n;/创建长度为n的数组以上两步也可以合并写为:数组类型名称数组变量名=new数组类型名称n;或者:数组类型名称数组变量名=new数组类型名称n;,定义与创建一个数组的示例:Fruitfruits;/定义Fruit类型的数组变量fruitsfruits=newFruit5;/新建有5个元素的数组fruitsfruits0=newFruit(香蕉,1000);/为数组元素赋值(引用对象)fruits1=newFruit(葡萄,2000);fruits2=newFruit(菠萝,2000);fruits3=newFruit(草莓,1000);fruits4=newFruit(橘子,1000);intn=fruits.length;/测试数组长度,.,9,用不规则数组实现112123123412345123456,用2维数组实现每日股指显示012345111331995150016551033216051981114312261265312261015164814111007417541472168017931065514691707174514771742.5215781550130911391357,5.2.1多维数组和不规则数组,根据数组的分配方式可将数组分为:一维数组和多维数组。Java中还可以定义不规则数组。我们可以把一维以上的数组看作是“数组的数组”。,模拟每日股指的程序StockpublicclassStockpublicStock()for(intweek=1;week=52;week+)stockValueweek0=week;for(intweekday=1;weekday=5;weekday+)stockValue0weekday=weekday;intstockIndex=(int)(Math.random()*1000+1000);stockValueweekweekday=stockIndex;publicvoidprintStock()for(intweek=0;week=52;week+)for(intweekday=0;weekday=5;weekday+)System.out.print(stockValueweekweekday+t);System.out.println();publicstaticvoidmain(Stringargs)Stocks=newStock();s.printStock();/打印股指年表intstockValue=newint536;,不规则数组演示程序ArrTestpublicclassArrTestpublicArrTest()for(intn=1;nmyArr.length;n+)myArrn=newintn+1;/创建数组的数组,每个数组的长度不一样。for(intm=1;mmyArrn.length;m+)myArrnm=m;publicvoidprintArr()for(intn=1;nmyArr.length;n+)for(intm=1;mmyArrn.length;m+)System.out.print(myArrnm+t);System.out.println();publicstaticvoidmain(Stringargs)ArrTestarr=newArrTest();arr.printArr();intmyArr=newintMax+1;/定义不规则数组,先创建数组的第1维。staticintMax=6;,.,10,5.2.3排序,冒泡法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮;较大的元素比较重,从而要往下沉。一个含有n个元素的列表,冒泡排序需要n-1次扫描来完成数据排序。快速排序是对冒泡排序的一种改进。它的基本思想是,通过一轮排序将待排序的数组元素分割成独立的两部分,其中一部分元素的关键字均比另一部分元素的关键字小,则分别可对这两部分元素继续进行排序,以达到整个数组序列有序。,冒泡排序比较和交换的过程演示,.,11,5.2.4查找,顺序查找就是将要查找的数据的关键字按一定的顺序挨个与列表中的数据进行比较,相等时就找到了所要的数据。对有序的列表可以使用更有效率的折半查找。折半查找是从一个列表的中间的元素来测试的,这将能够判别出目标在列表里的前半部还是后半部分。如果在前半部分,就不需要查找后半部分。如果在后半部分,就不需要查找前半部分。换句话说,可以通过判断排除一半的列表。重复这个过程直到找到目标或是目标不在这个列表里。,顺序查找和折半查找示例程序:publicclassSearch/顺序查找publicintsequentialSearch(intarr,intkey)for(intk=0;karr.length;k+)if(arrk=key)returnk;/成功,返回该数组元素的位置(即索引)return-1;/失败,返回-1/折半查找publicintbinarySearch(intarr,intkey)intlow=0;/初始化inthigh=arr.length-1;while(low=high)intmid=(low+high)/2;/取折半值if(arrmid=key)returnmid;/成功,返回该数组元素的位置(即索引)elseif(arrmidkey)low=mid+1;/定位查找上半段elsehigh=mid-1;/定位查找下半段return-1;/失败,返回-1,.,12,5.3对象容器,使用数组管理对象虽然有较高的计算效率,但是数组要求固定对象的数量,操作起来并不方便。特别当对象数量不明确的情况下,我们需要更复杂的方法来管理对象。Java类库中提供了一些用于管理对象集的类,称之为容器类(containerclasses)。它们可以在程序中用作对象的容器,持有和操作对象而不用担心容量的变化。Java容器的缺点是:一旦把对象放进容器,便失去了该对象的类型信息。容器中对象集的元素都是最基本的Object类型,也就是说,无论是何种类型的对象,进入容器后都向上转型为Object。因此,当我们从容器中取出对象时,可能无法知道它原来的类型。如果知道或者可以通过某种算法来判定出原来的类型,则可以将其转型为最初的实际类型。,.,13,5.3.1Java容器框架,列表(list)按照一定次序排列的对象集,对象之间有次序关系。集合(set)无次序的对象集,但这些对象都是唯一的,不会重复。映射(map)一群成对的对象集,这些对象各自保持着“键-值”(key-value)对应关系。其中,作为“键”的那些对象一定是一个set,即这些对象是唯一的,不会重复。,.,14,5.3.2Collection与Iterator,Collection是Java容器框架中的高层接口,它声明了所有容器类的核心方法,包括添加、清除、比较和持有对象(也称为对象集的元素)的操作。此外,Collection接口还提供了一个方法用于返回Iterator。迭代器是一个实现了Iterator或ListIterator接口的对象。它是一种“轻量级”的对象,消耗较小的资源,具有较高的效率,能够满足对象集的遍历。,.,15,5.3.3List及ListIterator,编程中最常用到的是List容器。List容器的重要属性是对象按次序排列。List通常由ArrayList和LinkList来实现,它提供了列表的插入、删除、定位、截取、遍历等操作。ArrayList以可变数组实现完成的List容器。允许快速随机访问,但是当元素的插入或移除发生于List中央位置时,效率便很差。对于ArrayList,建议使用ListIterator来进行向后或向前遍历,但而不宜用其来进行元素的插入和删除,因为所花代价远高于LinkedList。LinkedList以双向链表(double-linked1ist)实现完成的List容器。最佳适合遍历,但不适合快速随机访问。插入和删除元素效率较高。它还提供addFirst、addLast、getFirst、getLast、re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年万博科技职业学院单招综合素质考试题库必考题
- 2026年合肥经济技术职业学院单招综合素质考试题库附答案
- 2026年黎明职业大学单招职业倾向性测试必刷测试卷新版
- 2026年三峡电力职业学院单招职业技能测试题库完美版
- 2025年泾源县融媒体中心招聘参考题库及1套参考答案详解
- 2026年应天职业技术学院单招职业适应性测试必刷测试卷汇编
- 2026年燕京理工学院单招综合素质考试必刷测试卷完美版
- 2026年湖北三峡职业技术学院单招职业适应性考试必刷测试卷汇编
- 2026年上海商学院单招职业倾向性测试题库及答案1套
- 2026年河南对外经济贸易职业学院单招综合素质考试题库汇编
- 原产地知识培训课件
- 企业节能知识培训内容课件
- 2025江苏苏州市张家港市司法局招聘公益性岗位(编外)人员笔试备考试题及答案解析
- 2025年粮油仓储管理员初级考试试题(附答案)
- 消防水箱间施工方案
- 2025年电磁兼容产品行业研究报告及未来行业发展趋势预测
- 工厂盗窃安全培训内容课件
- 护士医学院毕业论文
- 12《拿来主义》公开课一等奖创新教学设计统编版高中语文必修上册
- 职工困难借款管理办法
- 音乐教师素养知识培训课件
评论
0/150
提交评论