【发布时间】:2012-11-04 07:51:51
【问题描述】:
我有一个元素数组。这个数组可能是:
- 随机洗牌(大约 20% 的时间)
- 几乎按升序排序*(大约 40% 的时间)
- 几乎按降序排序(大约 40% 的时间)
但我(事先)不知道这些情况中的哪一个适用。我更愿意将数组排序到它已经接近的顺序。
输出是升序还是降序无关紧要,但必须是其中之一(所以我可以对其进行二分查找。)
排序不必是稳定的。
一些背景信息:过程大致是这样的:
- 填充数组
- 按某个属性 A 排序
- 进行一些处理(计算分位数和其他一些小东西)
- 按其他属性 B 排序
- 做更多处理
- 按属性 C 排序
- 做更多处理
A 和 B 通常相互关联(但可能正相关或负相关)。同样适用于 B 和 C。有时 A == C。
* 这里的“几乎排序”意味着大多数元素都接近它们的最终位置。但很少准确地位于它们的最终位置(有很多加性噪声,并且没有多少长排序的子序列。)仍然,在数组的开头和结尾通常有一些“异常值”,它们是顺序的不良预测因子下一种。
有没有一种算法可以利用我不偏好升序和降序这一事实来更便宜地排序(与我目前使用的 TimSort 相比?)
【问题讨论】:
-
有什么原因不能预计算索引?
-
@Triptych:它们的寿命会很短。通常每个排序属性只使用一次,在数组被丢弃之前(只保留“做处理”步骤的结果。)