我一直在读书悲观算法与简单性分析 安德烈·布罗德和豪尔赫·斯托尔菲。这很有趣。他们编写了三个程序:搜索排序数组中的项,枚举连接图中的所有项,并将数组按升序排序;我们将查看排序算法,但您可能需要自己查看其他算法。下面是他们的排序算法:
这个慢速排序算法是对乘法投降范式,这可能是不情愿算法开发中最重要的一个范式。基本的乘法和放弃策略是将手头的问题替换为两个或多个子问题,每个子问题都比原始问题略简单,并尽可能长时间地以这种方式递归地乘法子问题和子问题。在某个时候,子问题都会变得如此简单,以至于它们的解决方案不能再被推迟,我们将不得不放弃。经验表明,在大多数情况下,当达到这一点时,总工作量将大大高于采用更直接的方法所浪费的工作量。
为了更好地掌握乘法和投降法,让我们循序渐进地学习慢速排序算法。我们可以分解排序问题n个数字A我,A2,…,An个按升序排列为:(1)找出这些数字中的最大值,(2)对其余的数字进行排序。子问题(1)可以进一步分解为(1.1)f和第一个问题的最大值[n个/2] 元素,(1.2)f和其余元素的最大值[n个/2] 元素,以及(1.3)f这两个最大值中的最大值。最后,子问题(1.1)和(1.2)可以通过对指定元素进行排序并获取结果中的最后一个元素来解决。因此,我们将原来的问题乘以三个稍微简单的问题(对前半部分进行排序,对后半部分进行分类,对除一个以外的所有元素进行排序),再加上一些开销处理。我们继续递归地这样做,直到列表中每个元素最多只有一个元素,此时我们不得不放弃。
我没有抄袭文章中的代码;如果你去看它,小心虫子!算法的时间复杂度为O(n个日志2(n个)/2).
您的任务是编写慢速排序程序;您可能还想编写研究和bwfs(磅/英尺)文章中提到的程序。完成后,欢迎您阅读或运行建议的解决方案,或在下面的评论中发布解决方案或讨论练习。
页:1 2