【问题标题】:Segregate ODD and EVEN numbers in an Array using C++使用 C++ 分隔数组中的奇数和偶数
【发布时间】:2019-10-12 23:46:02
【问题描述】:

我对编程并不陌生,我需要通过调用一个函数来对一个整数数组进行排序,方法是让左侧的所有奇数和右侧的偶数。

这是我的代码。

#include <iostream>

void sortOdd(int arr[], int size) {
int odd = 0;
int even = size - 1;

while (even > odd) {
  int temp;

  while(arr[odd] % 2 != 0) {
    odd++;
  }
  while(arr[even] % 2 == 0) {
    even--;
  }

  temp = arr[odd];
  arr[odd] = arr[even];
  arr[even] = temp;
  odd++;
  even--;
}
}

int main () {

int arr[] = {1, 2, 3, 4, 5, 6};
int size = sizeof(arr) / sizeof(arr[0]);


cout << "unsorted array" << endl;
for (int i = 0; i < size; i++) cout << arr[i] << " ";

sortOdd(arr, size);

cout << "sorted array" << endl;
for (int i = 0; i < size; i++) cout << arr[i] << " ";


  return 0;
}

问题是它只排序/交换外部元素而不是中间元素,它输出如下内容:

unsorted array
1 2 3 4 5 6
sorted array
1 5 4 3 2 6

有人可以帮助我在这里做错了什么吗?

谢谢。

【问题讨论】:

  • std::partition。这就是您正在寻找的功能。

标签: c++ arrays algorithm sorting


【解决方案1】:

你可以像这样使用std::partition

std::partition(std::begin(arr), std::end(arr), [](int a) {
    return a % 2;
});

【讨论】:

  • HaZa 试图实现的算法是 O(n),而这将是 O(n log n)。
  • @pjs -- std::partition 不是 O(n log n)。它是O(n)。这应该是公认的答案,除非 OP 这样做是为了学校练习并且需要从头开始实施。
  • @FredLarson 嗯...我认为是传递性失败了,但它实际上是成立的,因为你无法找到 a std::partition当然更好更简单)。
  • @PaulMcKenzie 知道了。谢谢。
【解决方案2】:

将您的 while 条件更改为:

while (even > odd+1)

您的算法在大多数情况下都有效,但您进行了一次额外的迭代,它会交换您的中间值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多