假设一个数组由a1,a2,...,ak,_,a(k + 1),...,an给出。 下划线(_)表示空格。我们可以将任何数组元素移动到这个空间。我们可以多次重复此操作。是否可以用一个这样的空格对每个数组进行排序?
答案 0 :(得分:4)
是的,这是可能的。
排序数组只是该数组的特定排列。
任何排列都可以通过一系列单独的互换来实现。
可以使用单个临时元素实现交换。
(实际上可以使用XOR操作对没有临时的整体类型的数组进行排序)。
答案 1 :(得分:0)
有多种就地排序算法。最值得注意的是快速排序的非递归版本(因为递归版本将占用堆栈上的空间与递归调用的数量成比例),平均而言将授予您O(n log n)复杂度。
另一种可能性是使用效率较低的算法,例如插入排序和冒泡排序,其复杂度为O(n ^ 2)。
对于您的具体问题,即使用该特定空间,您可以像Bathsheba所说的那样使用它进行交换,但我不会浪费时间进行这种操作。
还要考虑这样一个事实:如果你在数组中间有一个“未使用空间”的明确概念,你应该尝试理解它的语义,即在排序方面它的正确位置。如果你不这样做,并且你把它留在原地,你会发现自己有一个“破碎”的不变量,你将很难在你的集合中实现二元搜索等算法。
答案 2 :(得分:0)
我还没有在实际代码中看到过这样的容器,但实现最简单的算法(不是最有效的!)是将第一个元素交换为空,然后在第一个地方交换最小的空,然后假设容器从第二个位置开始并重复到最后一个位置,这将是空的空间。在这种情况下,交换只是意味着,填写空白空间并将其他位置标记为空。