algorithm - 对数组进行排序的算法,其中每个元素距离它应该在的位置 10 个位置
问题描述
对具有 n 个元素且每个元素在排序后最初距其位置 10 个位置的数组进行排序的最有效排序算法是什么?
我正在考虑插入排序,但我不知道如何证明:
(1) 效率最高。
(2) 该算法在最坏的情况下需要 O(n) 步来对 Array 进行排序。
一个自我设想的例子:[10,11,12,13,14,15,16,17,18,19,0,1,2,3,4,5,6,7,8,9,]
解决方案
有了这些限制,就没有那么多可能性了:
索引 0 处的值必须转到索引 10,因为这是距离索引 0 10 个位置的唯一索引。哪个值可以移动到索引 0?它只能是当前位于索引 10 的值。所以它是索引 0 和 10 之间的交换。
同理,索引 1 处的值将与索引 11 处的值交换,2 与 12 交换,3 与 13 交换,... 9 与 19 交换。
所以现在我们已经涵盖了 0..19 范围内的所有索引。此范围之外的任何值都不会进入该范围,该范围内的任何值也不会移出该范围。涉及这些指数的所有运动都已在上面定义。
我们可以对 20..39 范围内的索引重复相同的推理,并再次从位置 40..59,...等
所以我们可以得出结论:
- 数组的大小必须是 20 的倍数
- 只有一种排列是可能的,它遵守给定的规则
- 因此解决方案很简单。
伪代码解决方案:
sort(A):
for i = 0 to size(A) - 1 step 20:
swap A[i+0..i+9] with A[i+10..i+19]
在某些语言中,这种数组切片的交换可以非常有效地完成。
推荐阅读
- amazon-web-services - 如何在 AWS EMR 上安装 Hadoop 3?
- c - 浮点乘法溢出
- automated-tests - 如何使用 testng.xml 运行包中 100 个类中存在的 Method1?
- mysql - 在 mySQL 中加入 4 个表并包含 NULL 值
- ios - MetalPetal 的 MTIColorLookupFilter 输出不正确的结果
- javascript - 背景声音中的应用程序使用 Reactnative 消失 WebRTC
- eval - 在 LightGBM 中使用 eval() 评估测试数据集
- pdf - 比 EPUB 或 MOBI 更好的微型 PDF?
- python - 如何在 Python 中拆分只有一个整数值的列表?
- html - 试图获取此标签之间的文本但得到一个空列表