首页 > 解决方案 > 对数组进行排序的算法,其中每个元素距离它应该在的位置 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,]

标签: algorithmsortinginsertion-sortproof

解决方案


有了这些限制,就没有那么多可能性了:

索引 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]

在某些语言中,这种数组切片的交换可以非常有效地完成。


推荐阅读