【问题标题】:Sort odd and even numbers in the same order that they appear按照出现的顺序对奇数和偶数进行排序
【发布时间】:2014-10-21 12:53:26
【问题描述】:

我遇到过这个问题:有一个包含随机数的给定数组。我必须以这样的方式对这个数组进行排序,首先我将得到偶数,然后按照它们出现的确切顺序排列奇数。

例如输入:2,3,4,2,9,2,1,7,3,输出应为:2,4,2,2,3,9,1,7,3。

问题是我必须在没有任何额外内存的情况下执行此操作。如果我没有这个条件,2 个不同的偶数/奇数数组就可以了。

有什么想法吗?

编辑:好的,我必须补充一点,我是一个完整的新手。 另外,这是我的失败尝试:

cin>>n;
for (i=0;i<n;i++)
    cin>>a[i];
for (i=0;i<n;i++)
{
    for (j=0;j<n;j++)
    {

        if (a[j]%2==1 && a[j+1]%2==0)
        {
            aux=a[j];
            a[j]=a[j+1];
            a[j+1]=aux;
        }
    }
}
for (i=0;i<n;i++)
    cout<<a[i]<<" ";

【问题讨论】:

  • C 和 C++ 是两种不同的语言。你用的是哪个?
  • 那么你不应该标记 C++。
  • 到目前为止,我只使用了两个不同的数组,并在第一个数组中插入偶数,在第二个数组中插入奇数。然后我就把它们放在一起
  • 使用任何具有内存 O(1) 的稳定排序,对于值使用 value %2 ... 正如 @P0W 建议的那样。我什至不知道冒泡排序会起作用。

标签: c arrays


【解决方案1】:

做一些稳定的排序,例如冒泡排序或插入排序,使用特制的比较函数,将所有偶数分类为相等,所有奇数相等和任何奇数less 更大(感谢@luk32)比任何偶数都多。

【讨论】:

  • 您混淆了排序。偶数必须大于奇数才能符合示例,魔术函数是modulo 2,因为默认排序正在增加,我认为这是一种默认方法。也不是每个稳定的排序都会起作用。内存限制很重要,尽管您提到的示例是 O(1)。
  • @luk32 对,我做了逆序。稳定算法暗示了“数字按照它们出现的确切顺序”的要求,而我提到的那些是原位。当然可以选择其他一些算法,如前所述,这两个是例如
【解决方案2】:

要在 C 数组中执行此操作,一种相当幼稚的方法会起作用:

遍历数组直到找到奇数,现在向前扫描直到找到偶数并交换两个值。从下一个位置重新开始扫描。当任一扫描到达数组的末尾时,您就完成了。

这不是一个非常有效的算法,但它应该可以在不分配任何额外内存的情况下工作。

【讨论】:

  • 这是一个冒泡排序!万岁。
  • 是的 - 就像我说的不是很有效!
  • 时间复杂度不是限制。对我来说是 +1。
【解决方案3】:

其实很简单:

  • 创建一个与原始大小相同的数组。
  • 通过第一个数组将事件复制到新数组
  • 通过第一个数组,将赔率复制到新数组中
  • 更改指针指向新数组
  • 删除原数组

没有额外的内存...

  • 从第二个元素开始检查它是​​否是偶数。如果是,则检查进行中的元素,如果不是。如果没有,交换。存储交换的位置。
  • 执行此操作将阵列向上移动,直到不再进行交换为止。
  • 完成。

【讨论】:

  • 问题是我必须在同一个数组中做所有这些事情,我不应该创造任何新的东西
【解决方案4】:

一种解决方案是使用stack。每当您获得奇数时,将其推送到stack_odd,同样,对于偶数,将其推送到stack_even。这也将使您知道偶数和奇数的数量。现在开始填充原始数组。并确保您首先遇到的元素是为了填充数组中正确的数字顺序..(即,如果您首先遇到偶数,则使用stack_even开始填充原始数组。)

这将在O(n) 时间和O(n) 空间复杂度内完成任务。

【讨论】:

  • 反对票可能是因为使用了额外的 O(n) 内存,而 OP 明确声明 '问题是我必须在没有任何额外内存的情况下这样做。如果我没有这个条件,那么偶数/奇数的 2 个不同的数组就可以了。'只是猜测......
  • @CiaPan 哎呀,我没有完全阅读它,我只是跳出来给出解决方案。 :p
【解决方案5】:

我解决它的方法是找到数组的第一个奇数元素的索引和循环中下一个偶数元素的索引。

然后旋转所有元素。

类似

size_t firstodd, nexteven;
while (1) {
    firstodd = findfirstodd(arr, n);           // returns n when no odd element found
    if (firstodd == n) break;                  // no more changes needed
    nexteven = findnexteven(arr, n, firstodd); // returns n when no even element found
    if (nexteven == n) break;                  // no more changes needed
    rotate(arr, firstodd, nexteven);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2015-10-24
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多