在Sorting Algorithms网站上,提出以下索赔:
理想的排序算法将具有以下属性:
- 稳定:相同的键不会重新排序。
- 在原地运行,需要额外空间。
- 最坏情况键比较。
- 最坏情况下的交换。
- 自适应:当数据接近排序或唯一键很少时,速度最高可达。
没有具有所有这些属性的算法,因此排序算法的选择取决于应用程序。
我的问题是
没有具有所有这些属性的[sorting]算法
如果是这样,为什么?这些属性的原因是什么使得它们同时无法实现?
在Sorting Algorithms网站上,提出以下索赔:
理想的排序算法将具有以下属性:
- 稳定:相同的键不会重新排序。
- 在原地运行,需要额外空间。
- 最坏情况键比较。
- 最坏情况下的交换。
- 自适应:当数据接近排序或唯一键很少时,速度最高可达。
没有具有所有这些属性的算法,因此排序算法的选择取决于应用程序。
我的问题是
没有具有所有这些属性的[sorting]算法
如果是这样,为什么?这些属性的原因是什么使得它们同时无法实现?
Answers:
WikiSort和GrailSort是两个相当新的算法,可以进行稳定,最坏情况下的键比较。不幸的是,我对它们的理解不充分,无法知道它们是否接近交换或具有自适应性,因此我不知道它们是否违反了您所拥有的第四和第五条件。
通过查看WikiSort GitHub页面链接的Pok-Son Kim和Arne Kutzner的论文“基于比率的稳定就地合并”,Kim和Kutzner声称其“合并”操作为(WikiSort是Mergesort的变体),但是我不确定这是否转换为具有O(n)交换的WikiSort。GrailSort声称速度更快(在WikiSort GitHub页面上),因此我可以想象它们很可能都具有最差情况的O(n)交换并且具有自适应性。
如果有人设法理解WikiSort和/或GrailSort,我将不胜感激,他们也回答了我对此的公开问题。
Dijkstra的smoothsort接近,但不稳定。
没有已知的算法可以满足所有这些特性。随着我们开发更多的排序算法,这些属性受到追捧。例如,冒泡排序(可以说是最原始的排序算法)在第一个实现中很可能不稳定,但由于计算机科学家试图使其在以后的实现中更有效,因此它被设计为稳定的。因此,计算机科学家很可能从最佳算法中选择了最佳特征,因此,您列出了所有这些理想特征的清单。实际上,很难在所有方面拥有世界上最好的。并非没有可能,但是对于我们当前的体系结构来说可能并非不可能。
(尽管这是一个老问题,但我还是偶然发现了它,其他人也可能发现了。)
确实有一种算法可以满足(1)-(4)和(5)的后半部分,因此非常接近上述要求。它在[1]中进行了描述,并结合了过去几十年中发明的几种技巧。
[1]:Franceschini,G.理论计算系统(2007)40:327. https://doi.org/10.1007/s00224-006-1311-1