广东省汕头市金山中学高中信息技术 竞赛班数据结构专项培训教程 09内部排序教案.doc_第1页
广东省汕头市金山中学高中信息技术 竞赛班数据结构专项培训教程 09内部排序教案.doc_第2页
广东省汕头市金山中学高中信息技术 竞赛班数据结构专项培训教程 09内部排序教案.doc_第3页
广东省汕头市金山中学高中信息技术 竞赛班数据结构专项培训教程 09内部排序教案.doc_第4页
广东省汕头市金山中学高中信息技术 竞赛班数据结构专项培训教程 09内部排序教案.doc_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

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

文档简介

9 内部排序在数据结构里,排序一般分为:插入排序、交换排序、选择排序、归并排序和基数排序五种。写在前面的话:在看下面的各种算法之前,请先想想,如果给你一个无序的数列,你如何去排序?设计出你自己的算法。还有没有其它方法? 相信自己的能力,排序算法是连小学生都可以设计出的!不希望以后听到这样的话:“排序的算法我忘了”,排序算法不是背出来的!9.1 插入排序 (insertion sort)基本思想: 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。排序过程: 【示例】: 初始关键字 49 38 65 97 76 13 27 49 j=2(38) 38 49 65 97 76 13 27 49 j=3(65) 38 49 65 97 76 13 27 49 j=4(97) 38 49 65 97 76 13 27 49 j=5(76) 38 49 65 76 97 13 27 49 j=6(13) 13 38 49 65 76 97 27 49 j=7(27) 13 27 38 49 65 76 97 49 j=8(49) 13 27 38 49 49 65 76 97 9.2 选择排序基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。排序过程:【示例】: 初始关键字 49 38 65 97 76 13 27 49第一趟排序后 13 38 65 97 76 49 27 49第二趟排序后 13 27 65 97 76 49 38 49第三趟排序后 13 27 38 97 76 49 65 49第四趟排序后 13 27 38 49 49 97 65 76第五趟排序后 13 27 38 49 49 97 97 76第六趟排序后 13 27 38 49 49 76 76 97第七趟排序后 13 27 38 49 49 76 76 97最后排序结果 13 27 38 49 49 76 76 979.3 冒泡排序 (bubblesort)基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。排序过程:设想被排序的数组r1.n垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组r,凡扫描到违反本原则的轻气泡,就使其向上漂浮,如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。【示例】: 49 13 13 13 13 13 13 13 38 49 27 27 27 27 27 2765 38 49 38 38 38 38 3897 65 38 49 49 49 49 4976 97 65 49 49 49 49 4913 76 97 65 65 65 65 6527 27 76 97 76 76 76 7649 49 49 76 97 97 97 97 【练习1】 请分别用以上三种算法完成。同学们进行了身体素质测量,其中立位体前屈的成绩是以xx . xx cm来记录的,这个成绩不可能超过100,当有可能为负数(当指尖碰不到足时),现有若干同学的成绩,请帮他们排序。输入: 第一行 正整数 n (有n个同学) 第二行 n个成绩 输出: n个成绩从大到小的排列9.4 快速排序 (quick sort)基本思想:在当前无序区r1.h中任取一个数据元素作为比较的基准元素,用此基准元素将当前无序区划分为左右两个较小的无序区:r1.i-1和ri+1.h,且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准元素则位于最终排序的位置i上,即r1.i-1riri+1.h(1ih),当r1.i-1和ri+1.h均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。排序过程:将数列从小到大排序以第一个元素作为基准,设两指针i和j,初始时i指向区间第一个元素,j指向最末一个元素;先移动j指针,如果j元素比i元素大,j指针前移,否则若j小于i,则交换i和j 。交换i和j后,移动i指针,如果i元素比j元素小,i指针后移,否则若i大于j,则交换i和j 。再移动j指针,轮流移动i指针和j指针,直到j = i 。ij将数列分成两部分,分别进行上述过程。【示例】: 初始关键字 ,j指针左移 49 38 65 97 76 13 27 49ij第一次交换后 ,j指针不动,i指针右移 27 38 65 97 76 13 49 49ij第二次交换后 ,i指针不动,j指针左移 27 38 49 97 76 13 65 49 ji第三次交换后 ,j指针不动,i指针右移 27 38 13 97 76 49 65 49jiij第四次交换后,i指针不动,j指针左移 27 38 13 49 76 97 65 49j指针左移,遇i指针 27 38 13 49 76 97 65 49(递归过程) 初始关键字 49 38 65 97 76 13 27 49一趟排序之后 27 38 13 49 76 97 65 49 二趟排序之后 13 27 38 49 49 6576 97三趟排序之后 13 27 38 49 49 6576 97最后的排序结果 13 27 38 49 49 65 76 97 参考程序:procedure parttion(l, h : integer; var i : integer);对无序区rl,h做划分,i返回出本次划分后已被定位的基准元素的位置begini:=l; j:=h; x:=ri; 初始化repeat while (rj=x) and (ij) do j:=j1; j指针左移,查找第1个小于基准的元素 if ij then ri:=rj; 相当于交换ri和rjwhile (ri=rj) and (ij) do i:=i+1; i指针右移,查找第1个大于基准的元素 if ij then rj:=ri; until i=j;ri:=x; 基准x已被最终定位end; parttionprocedure quicksort(s,t:integer); 对rs.t快速排序beginif st then begin 当rs.t为空或只有一个元素是无需排序 partion (s,t,i); 对rs.t做划分,返回i quicksort (s,i-1); 递归处理左区间rs,i-1 quicksort (i+1,t); 递归处理右区间ri+1,tend;end; quicksort【练习2】请将给出的单词按字典排序。 (利用字符串比较) 输入:从文件word.in读入 第一行 正整数n 以下n行 每行一个单词 输出:写入文件word.out中按字典排序,每行一个单词9.5 堆排序 (heap sort)基本思想:堆排序是一树形选择排序,在排序过程中,将r1.n看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。堆的定义: n个元素的序列k1, k2, k3, , kn. 称为堆,当且仅当该序列满足特性: kik2i kik2i+1 (1 i n/2)堆实质上是满足如下性质的二叉树:1 是一棵完全二叉树;2 树中任一结点的值均大于等于(小于等于)其孩子结点的值;3 树根的值是最大的(最小的)例如序列10, 15, 56, 25, 30, 70就是一个堆,它对应的完全二叉树如下图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。这棵二叉树的存储,既可以用链表的方式存储,也可以用顺序表(一维数组s)的方式存储。采用顺序表的存储结构如上图所示,若某结点为s i ,则其左右子树分别为s 2i 和s 2i+1 。 堆的调整: 在介绍从一个无序序列建堆的方法前,我们先看如何在一个已建成的堆中,若在输出堆顶的最小值之后,调整剩余的n-1个元素的序列,重又建成一个一个堆。设图91为一个几建成的小根堆。图91输出堆顶元素后,以堆中最后元素代替之,如图92 (a)。此时根结点的左右子树均为堆,则仅需自上而下进行调整即可。首先以新堆顶元素与其左右子树根结点的值比较,由于右子树根结点的值小于左子树根结点的值,且小于根结点的值,则将根结点的值69与右子树根结点的值11交换, 如图92 (b)。由于69替代了11之后破坏了右子树的“堆”,需进行和上述相同的调整,直至叶子结点。调整后的状态如图92 (c)。这个过程可称为“筛”。( a )( b )( c )图92 调制建新堆的过程 输出堆顶元素后的调整过程如下:procedure sift ( var s : array 1.n of integer ; k , m : integer ); 假设sk+1. . m为小根堆,调整sk使整个序列sk . . m满足堆的性质 begin i:=k; j:=2*i; x:=sk; finish:=false; while (j=m) and (finish=false) do begin if (js j+1 ) then j:=j+1; 若存在右子树,且右子树根结点的值更小,则沿右分支调整 if x=s j then finish:=true else begin s i := s j ; i:=j; j:=2*i; end; end; whie s i :=x;end;排序过程:从一个无序序列建堆的过程就是一个反复调整的过程。将无序数列看成一棵完全二叉树,从最后一个非叶子结点i开始进行调整以该结点为根的子树,然后在调整以i-1为根的子树, 这样,在原序列的尾部形成有序区并逐步向前扩大到整个序列。【例】:对无序序列42,13,91,23,24,16,05,88建立大跟堆 【练习】对输入的无序序列进行堆排序。输入: 第一行: n 第二行: n个整数输出: 将n个整数按从小到大排序输出9.6 排序算法的比较和选择 1. 选取排序方法需要考虑的因素:(1) 待排序的元素数目n;(2) 元素本身信息量的大小;(3) 关键字的结构及其分布情况;(4) 语言工具的条件,辅助空间的大小等。2. 小结:(1) 若n较小(n = 50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。(2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。

温馨提示

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

评论

0/150

提交评论