您好!
/*
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");
}
(如有任何疑问请追问,我一直在线)