【发布时间】:2021-03-19 08:19:17
【问题描述】:
这是我正在研究的问题:
给定一个由 N 个正数和负数组成的未排序数组 Arr。您的任务是创建一个正负数数组不改变正负数的相对顺序。
所以,这就是我天真的想法!我使用插入排序的变体。
代码如下:
void reorder(int arr[], int n) {
for (int i = 0; i < n; i++) {
int hole = i;
while ((arr[hole] < 0) && (hole > 0)) {
int temp = arr[hole];
arr[hole] = arr[hole - 1];
arr[hole - 1] = temp;
hole--;
}
}
}
这段代码改变了负数的相对位置,这是不希望的。如何避免在我的代码中这样做?
示例
输入:
arr = { -12, 11, -13, -5, 6, -7, 5, -3, -6 };
预期结果:
-12 -13 -5 -7 -3 -6 11 6 5
但我的结果是:
-6 -3 -7 -5 -13 -12 11 6 5
【问题讨论】:
-
⟼请记住,尤其是在 Stack Overflow 上学习和提问时,尽可能让代码保持井井有条是很重要的。 Consistent indentation 有助于传达结构,更重要的是,有助于传达意图,这有助于我们快速找到问题的根源,而无需花费大量时间尝试解码正在发生的事情。
-
听起来像是
std::partition的工作。 -
也许更好std::stable_partition,以保持相对位置。
-
如果你出于某种原因想自己实现
stable_partition,看看这个answer。请注意,在O(n)时间无法实现就地稳定分区。 -
@Damien 更好,是的。感谢您指出这一点。