第十章 排序.ppt_第1页
第十章 排序.ppt_第2页
第十章 排序.ppt_第3页
第十章 排序.ppt_第4页
第十章 排序.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十章 排序,排序定义将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫 排序分类 按待排序记录所在位置 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序 按排序依据原则 插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序 基数排序,插入排序 直接插入排序 排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序,例,49 38 65 97 76 13 27,i=2 38 (38 49)

2、65 97 76 13 27,i=3 65 (38 49 65) 97 76 13 27,i=4 97 (38 49 65 97) 76 13 27,i=5 76 (38 49 65 76 97) 13 27,i=6 13 (13 38 49 65 76 97) 27,i=1 ( ),i=7 (13 38 49 65 76 97) 27,27,97,76,65,49,38,27,算法描述,完整的插入排序算法为: public void insertSort(int r) int i,j; for(i=2;ir.length;i+) r0=ri; j=i-1; while(r0rj) rj+1=

3、rj; j-; rj+1=r0; ,java.io.Comparable,该接口定义了一个比较方法compareTo()方法,实现类只要用该方法实现,就可以采用下面代码对该类的对象执行直接插入排序,以升序为例: public void InsertSort(Comparable a) Comparable t; for(int i = 1; i a.length; i +) t = ai; int j = i 1;,while(j 0) /对每个待插入元素寻找插入位置 if(pareTo(aj) 0) if(ai aj) /发现插入位置后,执行元素移动 aj + 1 = aj; /移动元素到合

4、适的位置,else /如果aiaj,则退出内循环 break; j -; aj + 1 = t; ,希尔排序 (Shell Sort),基本思想设待排序对象序列有 n 个对象, 首先取一个整数 gap n 作为间隔, 将全部对象分为 gap 个子序列, 所有距离为 gap 的对象放在同一个子序列中, 在每一个子序列中分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = gap/2,重复上述的子序列划分和排序工作。直到最后取 gap = 1, 将所有对象放在同一个序列中排序为止。 希尔排序方法又称为缩小增量排序。,希尔排序,设待排序序列23,56,70,25,12,32,50,59,

5、82,16,现利用希尔排序法对该序列进行排序,其排序过程如图所示,以升序为例:,public void shellOne(Comparable R, int d) int i,j,d; Comparable temp; d=R.length/2; while(d0) for(i=d;i=0 ,希尔排序的算法,冒泡排序 排序思路 将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r1.keyr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上 对前n-1个记录进行第二趟冒泡排序,结

6、果使关键字次大的记录被安置在第n-1个记录位置 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止,8.3 交换排序,21,08,25,49,25,16,21,49,25,25,16,08,21,49,25,25,16,08,初 始 关 键 字,第 一 趟 排 序,第 四 趟 排 序,第 二 趟 排 序,第 三 趟 排 序,21,49,25,25,16,08,第 五 趟 排 序,冒泡排序的过程,冒泡排序算法: public void bubble(Comparable r) int i,j,flag; Comparable temp; for(i=1;irj+1) flag=1

7、; temprj+1; rj+1=rj; rj=temp; if(flag=0) return; ,快速排序 基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序 排序过程:对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.key 初始时令i=s,j=t 首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换 重复上述两步,直至i=j为止 再分别对两个子序列进行快速排序,直到每个子序

8、列只含有一个记录为止,快速排序的过程,21,08,25,49,25*,16,初始关键字,08,25,49,25*,16,21,08,25,49,25*,16,08,25,49,25*,16,08,25,49,25*,16,08,25,49,25*,16,21,prikey,一次交换,二次交换,三次交换,四次交换,完成一趟排序,i,j,i,j,j,i,08,25,49,25*,16,21,完成一趟排序,分别进行快速排序,08,25,49,25*,16,21,有序序列,08,25,49,25*,16,21,直接选择排序 排序过程 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与

9、第一个记录交换 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换 重复上述操作,共进行n-1趟排序后,排序结束,选择排序,例,初始: 49 38 65 97 76 13 27 ,i=1,13,49,一趟: 13 38 65 97 76 49 27 ,i=2,27,38,六趟: 13 27 38 49 65 76 97 ,排序结束: 13 27 38 49 65 76 97,完整算法: public void selectSort(Comparable c) int i,j,k; Comparable temp; for(i=0;ic.length;i+) f

10、or(j=i+1,k=i;jc.length;j+) if(Rj.keyRk.key) k=j; if(k!=i) temp=Ri; Ri=Rk; Rk=temp; ,堆排序 堆的定义:n个元素的序列(k1,k2,kn),当且仅当满足下列关系时,称之为堆,例 (96,83,27,38,11,9),例 (13,38,27,50,76,65,49,97),可将堆序列看成完全二叉树,则堆顶 元素(完全二叉树的根)必为序列中 n个元素的最小值或最大值,堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程叫 堆排序需解决的两个问题: 如何由一个无序序列建成一个堆? 如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆? 第二个问题解决方法筛选 方法:输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论