ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:304.12KB ,
资源ID:6362670      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6362670.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第6章 常用算法与数据结构副本.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第6章 常用算法与数据结构副本.docx

1、第6章 常用算法与数据结构 副本第6章常用算法与数据结构本章要点: 排序与查找 堆栈与队列 树在非数值计算应用中,计算机加工的数据对象往往是大量的数据。这些数据存取、查找、插入和删除等等操作效率的提高,仅仅依赖程序设计的技巧已经无法达到目的,必须对这些被加工数据的组织形式加以研究,找出最佳的数据组织形式,并与好的程序设计技巧相配合,才能达到提高效率的目的。算法(algorithm)就是非空的、有限的指令序列,遵循它就可以完成某一确定的任务。数据结构是研究计算机中大量数据存储的组织形式,并定义相应的运算以提高计算机的数据处理的能力。在编制程序程序之前,首先应该选择一个恰当的数据结构和一个好的算法

2、。6.1 排序与查找本节介绍一些编程中常用的基本算法,这些算法不但在面向过程的程序设计中经常会用到,也是面向对象编程的重要工具之一。实际上,面向对象的编程中,封装起来的对象之间使用的是面向对象的原则,而被封装的对象内部依然遵循面向过程的编程的原则。 6.1.1 排序 排序是计算机中常用的一种重要的运算,其功能是将一个数据序列中的各个数据元素根据某个给出的关键值按从大到小(称为降序)或从小到大(称为升序)的排列。排序将改变数据序列中各元素的先后顺序,使之成为有序序列。排序分为内部排序和外部排序,内部排序的方法有很多,这里只介绍冒泡排序、选择排序和插入排序三种常用的排序算法。1、插入排序插入排序(

3、Insertion Sort)是一种简单的排序方法,它把待排序的数据序列划分成有序子列和无序子列两部分,程序开始时有序子列为空而无序子列包含了全部数据。它的基本操作是把无序子列的固定位置的数据(例如无序子列最前面的数据)插入到有序子列的合适位置中,从而得到一个新的、长度增1的有序子列。例如,已知待排序的一组序列的初始排列如下所示: 50,32,63,97,75,13,26,45假设在排序过程中,前4个数已按递增的次序重新排列,构成一个含4个数的有序序列 32,50,63,97现要将第5个数插入到上述序列,以得到一个新的含5个数的有序序列,则首先要在上述序列中进行查找以确定75所应插入的位置,然

4、后进行插入。假设从97起向左进行顺序查找,由于637597,则75应插入到63和97之间,从而得到下列新的有序序列 32,50,63,75,97【例6.1】插入排序 /* Program name InsertSortDemo.java 一个插入排序的例子*/class ArrayIns private double a; / 定义double类型的数组 private int nElems; / 变量nElems存储数据项数 public ArrayIns(int max) / 构造器 a = new doublemax; nElems = 0; public void insert(dou

5、ble value) / 插入数据到数组中 anElems = value; nElems+; public void display() / 显示数组中的数据 for(int j=0; jnElems; j+) System.out.print(aj + ); System.out.println(); public void insertionSort() int in, out; for(out=1; out0 & ain-1 = temp) / 查找插入的位置 ain = ain-1; / 数据在数组中右移一个位置 -in; ain = temp; / 插入到正确位置 / end in

6、sertionSort() / end class ArrayInsclass InsertSortDemo public static void main(String args) int maxSize = 100; / 数组初始大小为100 ArrayIns arr; arr = new ArrayIns(maxSize); / 建立排序数组 arr.insert(50); / 插入8个数 arr.insert(32); arr.insert(63); arr.insert(97); arr.insert(75); arr.insert(13); arr.insert(26); arr.

7、insert(45); System.out.println(排序前:); arr.display(); arr.insertionSort(); / 进行插入排序 System.out.println(排序后:); arr.display(); / end main() / end class InsertSortDemo在main()方法中通过调用方法insert(double value)插入了8个数,然后调用方法insertSort()进行排序,display()方法用来输出数据,其结果输出如图6-1所示。图6-1 【例6.1】的运行结果 2、冒泡排序 冒泡排序(Bubble Sort

8、)算法的基本思路是把当前数据序列中的各相邻数据两两比较,发现任何一对数据间不符合要求的升序或降序关系则立即调换它们的顺序,从而保证相邻数据间符合升序或降序的关系。 冒泡排序的过程很简单。首先将序列中的第一个数和第二个数进行比较,若为逆序(即第一个数第二个数),则将两个数交换之,然后比较第二个数和第三个数。依次类推,直至第n-1个数和第n个数进行过比较为止。上述过程称为第一趟冒泡排序,其结果使得序列中的最大数被安置到最后一个数的位置上。然后进行第二趟冒泡排序,对前n-1个记录进行相同的操作,其结果是使序列中次大的数被安置到第n-1个数的位置上。依此类推,每一趟两两比较和交换(称为“扫描”)都将使

9、一个数据就位并使未排序的数据数目减一,所以经过k趟1kn扫描之后,所有的数据都将就位,未排序数据数目为零,而整个冒泡排序就完成了。显然,判别冒泡排序结束的条件应该是“在一趟排序过程中没有进行过交换数的操作”。例如,已知待排序的一组序列的初始排列如下所示:50,32,63,97,75,13,26,45则经过第一趟冒泡排序后其序列如下所示: 32,50,63,75,13,26,45,97【例6.2】冒泡排序 /* Program name BubbleSortDemo.java 一个冒泡排序的例子*/ class ArrayBub private int a; / 定义int类型的数组 priva

10、te int nElems; / 变量nElems存储数据项数 public ArrayBub(int max) / 构造器 a = new intmax; nElems = 0; public void insert(int value) / 插入数据到数组中 anElems = value; nElems+; / 数据项增1 public void display() / 显示数组中的数据 for(int j=0; j1; out-) for(in=0; in ain+1 ) /若第in个数大于第in+1个数,则 swap(in, in+1); / 交换这两个数据 private void

11、 swap(int one, int two) double temp = aone; aone = atwo;/ 实现交换 atwo = temp; / end class ArrayBubclass BubbleSortDemo public static void main(String args) int maxSize = 100; / 数组初始大小为100 ArrayBub arr; arr = new ArrayBub(maxSize); / 建立排序数组 arr.insert(50); / 插入8个数 arr.insert(32); arr.insert(63); arr.in

12、sert(97); arr.insert(75); arr.insert(13); arr.insert(26); arr.insert(45); System.out.println(排序前:); arr.display(); arr.bubbleSort(); / 进行冒泡排序 System.out.println(排序后:); arr.display(); / end main() / end class BubbleSortDemo在main()方法中通过调用方法insert(double value)插入了8个数,然后调用方法bubbleSort()进行排序,display()方法用

13、来输出数据,其结果输出如图6-2所示。图6-2 【例6.2】的运行结果 在程序中,swap(int one, int two)方法用来交换下标为one与下标为two的两个数的位置,其中用临时变量temp暂存数据。 冒泡排序的一种改进方法是,在排序过程中,记下每次扫描时最后依次交换序列中的数发生的下标,显然,低于此下标的数都已排好了序,因而,扫描在此数位置处终止,而不必进行到预先确定的下限。3、选择排序选择排序(Select Sort)的基本思想也是把数据序列划分成两个子序列,一个子序列是已经排好序的数据,另一个子序列中是尚未排序的数据。程序开始时有序子列为空,而无序子列包含了全体数据。从无序子

14、列中选择一个合适的数据,例如,选择无序子列中的最小数据放到有序子列中,这样有序子列长度增长一,而无序子列减少一,这就是一次选择过程。重复这个选择过程,每次都在无序子列剩余的未排序数据中选择最小的一个放在有序子列的尾部,使得有序子列不断增长而无序子列不断减少,最终无序子列减少为空,所有的数据都在有序子列中按要求的顺序排列,整个排序的操作也就完成了。【例6.3】选择排序 /* Program name SelectSortDemo.java 一个选择排序的例子*/ class ArraySel private double a; / 定义double类型的数组 private int nElems

15、; / 变量nElems存储数据项数 public ArraySel(int max) / 构造器 a = new doublemax; nElems = 0; public void insert(double value) / 插入数据到数组中 anElems = value; nElems+; / 数据项增1 public void display() / 显示数组中的数据 for(int j=0; jnElems; j+) System.out.print(aj + ); System.out.println(); public void selectionSort() int out

16、, in, min; for(out=0; outnElems-1; out+) / outer loop min = out; / 选择最小数 for(in=out+1; innElems; in+) / inner loop if(ain amin ) / 若amin大于ain min = in; / 则得到一个更小的数 swap(out, min); / 且交换之 / end for(outer) / end selectionSort() private void swap(int one, int two) double temp = aone; aone = atwo;/ 实现交换

17、 atwo = temp; / end class ArraySelclass SelectSortDemo public static void main(String args) int maxSize = 100; / 数组初始大小为100 ArraySel arr; arr = new ArraySel(maxSize); / 建立排序数组 arr.insert(50); / 插入8个数 arr.insert(32); arr.insert(63); arr.insert(97); arr.insert(75); arr.insert(13); arr.insert(26); arr.

18、insert(45); System.out.println(排序前:); arr.display(); arr.selectionSort(); / 进行冒泡排序 System.out.println(排序后:); arr.display(); / end main() / end class SelectSortDemo在main()方法中通过调用方法insert(double value)插入了8个数,然后调用方法selectionSort()进行排序,display()方法用来输出数据,其结果输出如图6-3所示。图6-3 【例6.3】的运行结果上面介绍的几种排序算法各有特点,其中插入排

19、序最简单,当序列中的数“基本有序”或n值较小时,它是最佳的排序方法,因此长将它和其它的排序方法结合在一起使用。冒泡排序适合于排序数据数目不是很多的情况,但是它的操作代价较高,如果有N个数据参加排序,则使用冒泡算法的运算次数是N3数量级的量;选择排序和插入排序两个算法的代价比冒泡算法低一个数量级,运算次数在N2数量级。除了上述讲的三种方法外,还有其它许多种排序方法,例如快速排序、归并排序、堆排序等。6.1.2 查找查找(Searching)是根据给定的某个值,在一个数据集合或数据序列中确定一个其关键字等于给定值的数据元素。若数据集合或数据序列中存在这样的一个数据元素,则称查找是成功的,此时查找的

20、结果为给出整个数据元素的信息,或指示该数据元素在数据集合或数据序列中的位置;若数据集合或数据序列中不存在关键字等于给定值的数据元素,则称查找不成功。例如,表6-1为某学生自然班情况,学生的学号为关键字。假设给定值为20020115,则通过查找可得该学生的姓名、性别等,此时查找是成功的。若给定值为20020136,则由于表中没有关键字为20020136的记录,则查找不成功。表6-1 学生自然班情况学号姓名性别籍贯其它20020115李明男北京20020116刘丽女江西由于查找需要处理大量的数据,所以查找过程可能会占用较多的系统时间和系统内存;为了提高查找操作的效率,需要精心设计查找算法来降低执行

21、查找操作的时间和空间代价。较常用的查找算法有顺序查找、折半查找等。1、顺序查找顺序查找(Sequential Search)是最简单的查找算法,它的查找过程为:从数据序列的第一个数据开始,若某个关键字和给定值比较相等,则查找成功;反之,若直至最后一个数据,其关键字和给定值比较都不等,则表明数据序列中没有所查关键字,查找不成功。顺序查找对于数据序列没有特殊的要求,这个序列可以是排好序的,也可以是未排好序的,对于查找操作都没有影响。在数据序列中数据数目不多时,使用顺序查找非常方便。当然,顺序查找也可以从数据序列的最后一个数据开始。【例6.4】顺序查找 /* Program name SqSearc

22、h.java 一个顺序查找的例子*/public class SqSearch /数据数组 public static int data=50,32,63,97,75,13,26,45; public static void main(String args) if(sequence(63) /查找63 System.out.println(The data 63 found.); else System.out.println(The data 63 no found!); if(sequence(25) /查找25 System.out.println(The data 25 found.

23、); else System.out.println(The data 25 no found!); public static boolean sequence(int key) int i;/数组下标变量 for (i=0;idata3=45,则low=mid+1=3+1=4,high=7,mid=(4+7)/2=5。步骤2: 63=data5,找到数据。查找数据25的过程如下:步骤1: 25data3,则low=0,high=mid-1=3-1=2,mid=(0+2)/2=1。步骤2: 25data0,则low=mid+1=0+1=1,high=0,因为lowhigh,所以未能找到数据。

24、【例6.5】折半查找/* Program name BSearch.java 一个折半查找的例子*/public class BSearch public static int max=8; public static int data=13,26,32,45,50,63,75,97; public static int counter=1;/计算查找的次数的变量 public static void main(String args) for(int i=0;i8;i+) System.out.print( +datai+); /输出数据 System.out.println();/换行 i

25、f(BinarySearch(63) /查找63 System.out.println(Search time=+counter); else System.out.println(The data 63 no found!); if(BinarySearch(25) /查找25 System.out.println(Search time=+counter); else System.out.println(The data 25 no found!); public static boolean BinarySearch(int key) int low; /下界 int high; /上界 int mid; /中间位置 low=0; high=max-1; while(low=high) mid=(low+high)/2; if(keydatamid) /待查找值较大 low=mid+1; /查找后半段 else if(key=datamid) /查找到数据 System.out.println(data+mid+ = +data

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1