《数据结构》第10章:排序.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第10章 排 序 排序的基本概念 常用内部排序 外部排序 直接插入排序 直接插入排序是插入排序中最简单的排序方法,假设排序表中有n个记录,存储在一维数组R[n]中。直接插入排序的基本思想为:把待排记录按排序码大小插入到已排好序的有序表中。 折半插入排序 希尔排序(又称缩小增量排序) 希尔排序(Shell’s sort)又称缩小增量排序,是1959年由D.L.Shell提出来的。希尔排序可以理解为对直接插入排序的一种改进。直接插入排序是从第二个元素开始比较的,循环起始条件为i=2,可以将i=2写成i=1+1,将第一个1用dk代替,即循环初始条件为i= dk +1,dk是一个希尔增量序列,一般可取做dk ={5,3,1}(当然也可以取其他素数序列,但最后一个必为1),从第i个记录开始,间隔dk 的记录为一组,每次用第i个关键字与第I–dk个关键字进行比较后做插入排序。 冒泡排序 冒泡排序的基本思想:从第一个元素开始,通过每两个相邻元素的比较,大的记录下沉(后移),同时较小的记录就像“气泡”一样浮到序列前面的位置。一趟冒泡排序后,值最大的记录就排在了序列的最后,二趟排序后,第二大的记录就排在了倒数第二个位置,依此类推,直到把整个记录排完为止,序列就变成有序的了。 需要把每一趟冒泡排序最后一个下沉记录的位置记下,下一遍只检查比较到此为止,到所有记录都不发生下沉时,整个过程结束。所以n个元素实施冒泡排序,共需要n–1趟排序,每趟需要n–i次比较。 快速排序 快速排序是对冒泡排序的一种改进。找一个记录,以它的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,反之,凡关键字大于枢轴的记录均移动至该记录之后。致使一趟排序之后,记录的无序序列以该记录关键字为枢轴分割成两部分:枢轴元素左边的所有的关键字值均小于枢轴元素,枢轴元素右边的所有元素值均大于枢轴元素。第二趟再分别对分割成两部分的子序列进行快速排序,依此类推,直到每个待排序列的子序列中只有一个记录时为止,整个排序过程结束。 简单选择排序 简单选择排序是最简单的一种选择排序。其基本思想是:对有n条记录的关键字序 列,第i趟简单选择排序是从关键字序列中第i个记录开始到第n 个记录结束的n–i+1个记录中选出关键字最小的记录与第i个记录进行交换。(其中i从1到n–1共进行n–1趟选择排序) 树形选择排序 树形选择排序又称为锦标赛排序,其基本思想是:首先对n个记录的关键字进行两两比较,选出最大的作为子树的根结点。然后在其中n/2个较大的根结点之间再进行两两比较,直到选出最大关键字的记录为止,可以用一棵有n个叶子结点的完全二叉树表示。此时根结点就是排序关键字最大的结点,把选走后的叶设为最小,重新进行比较选择,依此选择下去,直到排序完成。 堆排序 设有n个元素的序列k1,k2,…kn,当且仅当待排序列关键字满足下述关系之一时,称之为堆。如图10.7所示分别为小顶堆和大顶堆的表示和存储结构。 归 并 排 序 所谓归并排序就是两个或者两个以上的有序数据序列合并成一个有序序列的过程。 归并排序的基本思想为: (1) 将n个记录的待排序列看成为有n个长度都为1的有序表; (2) 将两两相邻的子表归并为一个有序子表; (3) 重复上述步骤,直至归并为一个长度为n的有序表。 基 数 排 序 多关键字的排序 链式基数排序 链式基数排序 例10.7 以静态链表存储的排序表的基数排序过程如图10.10所示。排序表记录关键字为:178,109,63,593,284,55,269,8,830,如图10.10为分配和收集的过程。 外 部 排 序 外部排序指的是大文件的排序,即待排的记录存储在外存储器上,在排序过程中需要进行多次的内、外存之间的交换,外部排序基本上由两个相对独立的阶段组成。首先,按可用内存的大小,将外存上含有n个记录的文件分成若干个长度为k的子文件或段,依次读入内存并利用有效的内部排序方法对它们进行排序,并将排序后得到的有序子文件重新写入内存。通常称这些有序子文件为归并段或顺串;然后,对这些归并段进行逐趟归并,使归并段(有序子文件)逐渐由小到大,直至得到整个有序文件为止。 相关的数据结构: #define KEY_NUM 8 //关键字项数 #define RADIX 10 //关键字基数,此时为十进制整数的基数 #define MAX_SPACE 1000 // 分配的最大可利用存储空间 typedef struct { KeyType keys[KEY_NUM]; //关键字字段 InfoType otheritems; //其他字段 int nex

文档评论(0)

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

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

1亿VIP精品文档

相关文档