排序算法小结.docVIP

  • 4
  • 0
  • 约9.7千字
  • 约 7页
  • 2018-04-03 发布于河南
  • 举报
排序算法小结

排序算法小结 By 覃左言 介绍 在计算机科学中,排序算法就是将一列元素按照某种顺序放置。最常见的顺序是数序和字典序。高效的排序算法对于优化其他需要排序操作的算法非常重要,譬如查找和归并。 自从计算机科学出现以来,排序算法就得到了很大关注,譬如,冒泡排序法从1956年就已经开始被分析,尽管它也算一种解决方案,但是依然不断有新的算法涌现,例如图书馆排序算法就是在2004年的时候被首次提出的。而排序算法也常常被用来作为计算机算法的教学材料,因为大量的排序算法是阐述诸如大O记法、分治思想、数据结构、随机算法、最坏最好及平均时间度分析、时间空间权衡等概念的很好的切入点。 排序算法分类标准众多,常见的有: 计算复杂度(就元素比较次数而言):与待排序数组长度n相关的元素比较次数。典型来说一个比较好的算法的复杂度可能是O(nlogn),而较差的算法的复杂度可能是O(n2)。 计算复杂度(就元素交换次数而言)。 空间复杂度:排序过程中需要使用的额外的内存大小。有些算法是“In place”算法,也就是说它们只需要O(1)或者O(nlogn)的额外内存。 递归性。有的算法或者是递归的或者是非递归的,还有些算法使用两种方式都可以。 稳定性:如果一个算法在排序过程中保持等值元素在序列中的相对位置不变,则称之为稳定的排序算法。 是否是比较排序算法。比较排序算法在排序过程中对元素的处理仅在于使用比较操作符比较两个元素的大小。 适应性:输入的元素次序是否对算法运行时间产生影响。 不同排序算法的比较 下面表格中,我们用n表示待排序的元素个数。“Average”和“Worst”给出了平均复杂度和最坏情况下的复杂度,在计算复杂度的时候我们把比较、交换以及其他类似的操作的处理时间看作常数。“Memory”给出了空间复杂度,尤其指除去输入的元素表本身所需空间后需要的额外存储空间。 典型的排序算法 交换排序 交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。shrink factor)并根据该gap进行类似冒泡法的排序,然后现有gap除以该缩减因子得到新的gap并根据新的gap再次排序,直到gap减至1。最后一步实际上就是冒泡排序,但是此时序列中影响性能的“乌龟”已经不存在了,因此性能得到提升。实验表明该缩减因子大约为1.3时算法性能最好,平均时间复杂度接近O(nlogn),差不多可以和快速排序算法媲美。 奇偶排序(Odd-even Sort)是冒泡排序的另一种变形。它与冒泡算法的区别在于它首先比较所有(odd,even)对,如果有逆序则交换,然后比较所有(even,odd)对,如果有逆序则交换,如此交替迭代,直至全部有序。该过程可以看作是冒泡排序的并行版本,即两个CPU同时进行冒泡排序,只是排序的起始位置不同。该算法最坏情况时间复杂度也是O(n2)。 快速排序(Quick sort)是由C. A. R. Hoare于1962年提出的划分交换排序算法,也是当前世界上使用最多的排序算法之一。它采用了一种分治的策略,设当前待排序的无序区为R[low..high],其基本思想可以描述为:在R[low..high]中任选一个元素作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有元素均小于等于基准元素,右边的子区间中所有元素的关键字均大于等于基准元素,而基准元素本身则位于正确的位置上,它无须参加后续的排序;通过递归调用快速排序对左、右子区间快速排序当两个递归调用结束时,其左、右两个子区间已有序,步骤无须做什么,可看作是空操作。Median of Medians algorithm),它首先将待排序列划分为5个一组,对每组求得其中位数,然后将所有的中位数收集在一起看作新的待排序列,用同样的办法递归求它们的“中位数的中位数”,直到最后得到一个所有中位数的中位数,将其作为划分基准元素,该方法保证每次划分的比率在30%/70%到70%/30%之间,所以保证最坏情况复杂度为O(nlogn)。 从稳定性来说,快速排序是不稳定的排序。从空间复杂度来说,使用就地划分和尾递归方法实现时,快速排序只需要使用O(logn)的额外空间(用作递归栈)。在通常情况下,快速排序要快于堆排序,但是堆排序的最坏情况复杂度为O(nlogn),因此各有优势。 自省排序(Introspective sort / Introsort)是David Musser于1997年提出来的对快速排序的改进算法。它首先使用快速排序,但是在执行过程中监控递归调用的深度,如果深度超过了某个阀值(与logn相关),就转向使用堆排序算法。因此它是集合了两种算法

文档评论(0)

1亿VIP精品文档

相关文档