【问题标题】:How to avoid swapping negative numbers when arranging for all negative and positive numbers in array排列数组中的所有负数和正数时如何避免交换负数
【发布时间】: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 更好,是的。感谢您指出这一点。

标签: c++ arrays algorithm


【解决方案1】:

请注意,作业说“你的任务是创建一个数组”...所以如果我理解正确,你不会被要求修改 输入数组,但要创建一个。

那么解决方案就很简单了:

  • 创建一个与输入数组大小相同的数组
  • 迭代输入数组并将负值复制到新数组中
  • 再次迭代输入数组,现在将正值复制到新数组中
  • 返回新数组。

这具有线性时间复杂度。

【讨论】:

  • 天啊!非常感谢。我想知道我是否问对了问题。但似乎你读懂了我的想法
  • 哦,是的!对不起,我只是想弄清楚。
  • 没问题。谢谢!
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多