- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Data Structures and Algorithms with Java Chapter7 Advanced Sorting 本章内容和重点 希尔排序 划分 快速排序 基数排序 ① 希尔排序 Shellsort 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法。希尔排序算法基于插入排序,但是增加了一个新的特性,大大地提高了插入排序的执行效率。 回顾插入排序: 原理:在插入排序执行的一半的时候,标记符左边这部分数据项都是排过序的,而标记右边的数据项则没有排过序。这个算法取出标记符所指的数据项,把它存储在一个临时变量里。接着,从刚刚被移除的数据项的左边第一个单元开始,每次把有序的数据项向右移动一个单元,直到存储在临时变量里的数据项能够有序回插。 存在问题:假定最小数据项在靠近右端的位置上,在其回到前端正确位置时,中间的数据项需要复制将近N次,虽不是所有数据项都移动N次,但平均移动了N/2个位置,这就执行了N*N/2次复制。 如果能以某种方式,不必一个一个地移动所有中间的数据项,就能把较小数据项移动到左端,那么这个算法的效率将会有很大的提高。 N增量排序 N-SORTING 希尔排序通过加大插入排序中元素之间的间隔,并在这些间隔的元素中进行插入排序,从而使数据项能大跨度地移动。当这些数据项排过一趟后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去。进行排序过程时,数据项之间的间隔被称为增量,习惯用h表示。 如图:显示了增量为4时,对包含10个数据项的数组进行排序的第一个步骤情况: 上面的一次排序过程,所有元素离它在最终有序序列中的位置相差都不到两个单元,这就是数组”基本有序”的含义,也是希尔排序的精髓所在。 4增量排序后,可以进行普通的插入排序,即1增量的排序。 减小间隔:对于更大的数组,开始的间隔也应该更大,然后间隔不断减小,直到间隔变为1。如含有1000个数据项的数组,可能以364,121,40,13,4,1为增量。h’=3h+1 h = 3*h + 1 Knuth序列 SHELLSORT的Java代码 Applet 希尔排序的效率 迄今为止,还没有人能够从理论上分析希尔排序的效率。有各种各样基于试验的评估,估计它的数量级从 O(N3/2) 到 O(N7/6)。 ② 划分 Partitioning 划分是后面讨论快速排序的根本机制。 划分数据就是把数据分为两组,使所有关键字大于特定值的数据项在一组,使所有关键字小于特定值的在一组。 完成划分之后,数组还不能称为有序:只是简单地分为了两组,但数据比原来顺序排列来说,接近有序了。 Partition.java的程序代码 main()例程创建了一个可以容纳16个long类型数据项的ArrayPar对象。枢纽定为99.例程在ArrayPar中插入16个任意值,显示他们,调用partitionIt()方法对它们实行划分,然后再次显示结果。 划分算法 划分算法由两个指针开始工作,两个指针分别指向数组的两头。(指针-不同于C++里的指针概念,在这里是指指示的数据项。) 停止和交换:当leftScan碰到比枢纽小的数据项时,直接后移,但是,遇到大的数据项时,停止。同理,rightScan… Leftscan和RightScan都指着在数组错误一方的数据项时,交换。 划分的效率 划分算法的运行时间为O(N): 两个指针开始时分别在数组的两端,然后以或大或小的恒定速度相向移动,停止移动并且在移动的过程中交换。当两个指针相遇时,划分完成。 ③ 快速排序 Quicksort 毫无疑问,快速排序是最流行的排序算法,因为有充足的理由,大多数情况下,快速排序都是最快的,执行时间为 O(N*logN) 级。 快速排序算法本质上通过把一个数组划分为两个子数组,然后递归地调用自身为每一个子数组进行快速排序来实现的。 快速排序算法 基本的基于递归的快速排序算法非常简单。下面是一个实例: 选择枢纽 partitionIt()应该怎样选择枢纽呢? 应该选择具体的一个数据项的关键字的值作为枢纽:称这个数据项为pivot; 可以选择任意一个数据项作为枢纽,为了简便,总是选择最右端的数据项; 划分完成之后,如果枢纽被插入到左右子数组之间的分界处,那么枢纽就落在了排序之后的最终位置上了。 “三数据项”取中划分 折中的方法是找到数组里第一个、最后一个以及中间位置数据项的居中数据项值,并且设此数据项为枢纽。选择第一个、最后一个以及中间位置数据项的中值被称为“三数据项取中”方法。 处理小划分 如果使用三数据项取中划分方法,则必须要遵循快速排序算法不能执行3个或少于三个数据项划分的规则。在这种情况下,数字3被称为切割
原创力文档


文档评论(0)