设一系列正整数存放在一个数组中,试设计算法,将所有奇数存放在数组的前半部分.(利用C语言)

设一系列正整数存放在一个数组中,试设计算法,将所有奇数存放在数组的前半部分,将所有的偶数存放在数组的后半部分。要求尽可能的少用临时单元并使用时间少。(利用C语言)
帮助我一下,真不会啊。

您好!

/* 
i从a的首部往后移动,j从a的尾部往前移动,若a[i]为偶数且a[j]为奇数,则交换,否则根据情况移动i或j。
时间复杂度:length(a)。
空间复杂度:数组a。

个人认为这是时空效率最好的,其他网友不服来辩。

*/

#include <iostream>
using namespace std;
const int n = 10;
int main()
{
int a[n] = {3,18,2,12,12,5,6,7,8,9};
int i = 0;
int j = n;
while (i < j)
{

if (0 == a[i] % 2 && 1 == a[j] % 2)
{
swap(a[i],a[j]); //a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j];
i++;
j--;
continue;
}


if (1 == a[i] % 2)
{
i++;
}

if (0 == a[j] % 2)
{
j--;
}
}

for (i = 0; i < n; i++)
{
cout <<a[i] <<" ";
}
cout <<endl;
return 0;
}


(如有任何疑问请追问,我一直在线)

追问

改成C语言行吗?

追答#include <stdio.h> //c语言标准输入输出头文件

#define n 10 //宏定义,数组的大小
void main()
{
    int a[n] = {3,18,2,12,12,5,6,7,8,9}; //初始化数组
    int i = 0;
    int j = n;
    while (i < j)
    {
 
        if (0 == a[i] % 2 && 1 == a[j] % 2) //如果数组左边是偶数,右边是奇数
        {
            //swap(a[i],a[j]);

/*交换两个数,这是最好的交换算法*/
a[i] = a[i] ^ a[j]; 
a[j] = a[i] ^ a[j]; 
a[i] = a[i] ^ a[j];
            i++;
            j--;
            continue; //交换之后后面的就不用执行了
        }
 
 
/*不符合交换条件那就i接着往后移动,j接着往前移动*/

        if (1 == a[i] % 2)
        {
            i++;
        }
 
        if (0 == a[j] % 2)
        {
            j--;
        }
    }
 
/*输出*/
    for (i = 0; i < n; i++)
    {
printf("%d ",a[i]);
    }
    printf("\n");
}

(如有任何疑问请追问,我一直在线)

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-19
int a[100];
int i,j,k=0;
int temp;
for(i=0;i<100;i++)
{
if(a[i]%2==1)

{
a[j]=a[i];

j++;

}

else //如果是偶数,则倒数交换是奇数的数

{
while(a[100-k]%==0)

{
k++;

}
temp=a[i];

a[i]=a[100-k];

a[100-k]=temp;

}

}
随便看了一下,简化了一些步骤,你看是不是你希望的算法。
相似回答