按照它们出现的顺序对奇数和偶数进行排序

时间:2014-10-21 12:53:27

标签: c arrays

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

例如输入: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]<<" ";

5 个答案:

答案 0 :(得分:1)

进行一些稳定的排序,例如气泡或插入排序,使用特制的比较函数,将所有偶数相等,所有奇数相等,任何奇数 更大(谢谢,@ luk32)比任何偶数。

答案 1 :(得分:0)

要在C数组中执行此操作,可以使用相当天真的方法:

扫描数组直到找到奇数,然后向前扫描,直到找到偶数并交换这两个值。从下一个位置再次开始扫描。当任一扫描到达阵列的末尾时就完成了。

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

答案 2 :(得分:0)

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

然后旋转所有元素。

这样的东西
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);
}

答案 3 :(得分:-1)

这很简单:

  • 制作与原始阵列大小相同的阵列。
  • 通过第一个将evens复制到新阵列的阵列
  • 通过第一个数组将赔率复制到新数组
  • 将指针更改为指向新数组
  • 删除原始数组

没有额外的记忆......

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

答案 4 :(得分:-1)

一种解决方案可以是stack。每当你得到奇数时,都会在stack_odd中推送它,同样地,偶数将它推到stack_even。这也可以让你知道偶数和奇数的数量。现在开始填充原始数组。并且还要确保首先遇到哪个元素,以便在数组中填充正确的数字顺序..(即,如果您遇到偶数,则首先使用stack_even开始填充原始数组。)

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