Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按奇数和偶数出现的顺序排序_C_Arrays - Fatal编程技术网

C 按奇数和偶数出现的顺序排序

C 按奇数和偶数出现的顺序排序,c,arrays,C,Arrays,我遇到了这样一个问题:有一个给定的数组,其中包含随机数。我必须以这样的方式对这个数组进行排序,首先是偶数,然后是奇数,按照它们出现的确切顺序 例如,输入:2,3,4,2,9,2,1,7,3,输出应类似于:2,4,2,2,3,9,1,7,3 问题是我必须在没有任何额外记忆的情况下完成这项工作。如果我没有这个条件,2个不同的偶数/奇数数组就可以完成这个任务 有什么想法吗 编辑:好的,我必须补充一点,我是一个完全的新手。 此外,这是我失败的尝试: cin>>n; 对于(i=0;i>a[i]; 对于(i

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

例如,输入:2,3,4,2,9,2,1,7,3,输出应类似于:2,4,2,2,3,9,1,7,3

问题是我必须在没有任何额外记忆的情况下完成这项工作。如果我没有这个条件,2个不同的偶数/奇数数组就可以完成这个任务

有什么想法吗

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

cin>>n;
对于(i=0;i>a[i];
对于(i=0;i而言,这相当简单:

  • 使数组的大小与原始数组的大小相同
  • 传递第一个数组,将even复制到新数组
  • 传递第一个数组,将赔率复制到新数组
  • 将指针更改为指向新数组
  • 删除原始数组
没有额外的内存

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

要在C数组中实现这一点,一种相当简单的方法可以:

扫描数组直到找到奇数,现在向前扫描直到找到偶数并交换两个值。从下一个位置再次开始扫描。当任一扫描到达数组末尾时,您的操作完成


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

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

一种解决方案可以是使用
堆栈
。每当你得到奇数时,将其推入
堆栈(奇数)
,同样地,对于偶数,将其推入
堆栈(偶数)
。这也会让你知道奇数和偶数的数目。现在开始填充原始数组。还要确保哪个元素为了填充数组中正确的数字顺序,您遇到了first(即,如果遇到偶数,请首先使用
stack\u偶数
填充原始数组)


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

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

然后旋转所有元素

差不多

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);
}

C和C++是两种不同的语言。你使用哪种语言?看。你不应该标记C++。直到现在我只用了两个不同的数组,在第一个和第二个数组中插入偶数。然后我把它们放在一起,使用任何带有记忆O(1)的稳定排序。对于值,使用
value%2
…正如@P0W建议的那样。我不知道甚至气泡排序都不起作用。问题是,我必须在同一个数组中执行所有这些操作,我不应该创建任何新的气泡排序!万岁。是的,就像我说的,效率不高!时间复杂性不是一个约束条件。对我来说,它是+1。你混合了排序。偶数必须大于奇数才能符合示例,神奇的函数是模2,因为默认顺序是递增的,我认为这是一种默认方法。此外,并非每个稳定排序都能工作。内存约束很重要,尽管您提到的示例是O(1)@luk32是的,我已经做了逆序。稳定算法是一种要求的暗示,即“数字的顺序与它们出现的顺序完全一致”,我提到的那些是原位的。当然,人们可能会选择其他算法,例如,这两种算法。下一票可能是因为使用了额外的O(n)内存,而OP明确指出“问题是我必须在没有任何额外内存的情况下执行此操作。如果我没有此条件,2个不同的偶数/奇数数组就可以完成此操作。”只是猜测…@CiaPan oops我没有完全阅读它,我只是跳出来给出解决方案。:p
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);
}