第一种:

开辟一个一样大小的数组,遍历原数组的数据,把原数组奇数依次存放在新数组的前面,偶数存放在后面。

时间复杂度:O(n^2);

空间复杂度:O(n)

缺陷:效率太差

#include<stdio.h>
#include<stdlib.h>
void Adjust(int* src,int* des,int n)
{
	int index=0;
		for(int j=0;j<n;j++)
		{
			if(src[j]%2)
			{
				des[index]=src[j];
				index++;
			}
		}
		for(int j=0;j<n;j++)
		{
			if(!(src[j]%2))
			{
				des[index]=src[j];
				index++;
			}
		}
	
}
void test()
{
	int a1[10]={2,4,4,66,76,86,20,10,24,18};
	int a2[10]={1,3,5,35,15,13,17,19,17,21};
	int a3[10]={1,2,5,36,16,13,17,19,14,21};
	int a[10];
	Adjust(a3,a,sizeof(a3)/sizeof(a3[0]));
	for(int i=0;i<sizeof(a3)/sizeof(a3[0]);i++)
	{
		printf("%d ",a3[i]);
	}
	printf("\n");
	for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
	{
		printf("%d ",a[i]);
	}
}
int main()
{
	test();
	system("pause");
	return 0;
}

结果:

wKiom1cu6THRYEX-AAAcFk1xtdY365.png

第二种:

利用两个指针,一个指向数组开始,一个指向数组末尾,指向数组开始的那个指针依次向后遍历,找到偶数立即停下来,指向数组末尾的那个指针向前遍历,找到奇数停下来,判断start<=end,,交换两个值。

#include<stdio.h>
#include<stdlib.h>
bool Check(int num)
{
	return num%2;
}
void swap(int* a,int *b)
{
	int tmp=*a;
	*a=*b;
	*b=tmp;
}
void Adjust(int* a,int n)
{
	int start=0;
	int end=n-1;
	while(start<=end)
	{
		while(Check(a[start])&&start<=end)
		{
			start++;
		}
		while(!(Check(a[end]))&&start<=end)
		{
			end--;
		}
		if(start<end)
		{
			swap(&a[start],&a[end]);
		}
	}

}
void test()
{
	int a1[10]={2,4,4,66,76,86,20,10,24,18};
	int a2[10]={1,3,5,35,15,13,17,19,17,21};
	int a3[10]={1,2,5,36,16,13,17,19,14,21};
	Adjust(a1,sizeof(a1)/sizeof(a1[0]));
	for(int i=0;i<sizeof(a1)/sizeof(a1[0]);i++)
	{
		printf("%d ",a1[i]);
	}
	printf("\n");
	Adjust(a2,sizeof(a2)/sizeof(a2[0]));
	for(int i=0;i<sizeof(a2)/sizeof(a2[0]);i++)
	{
		printf("%d ",a2[i]);
	}
	printf("\n");
	Adjust(a3,sizeof(a3)/sizeof(a3[0]));
	for(int i=0;i<sizeof(a3)/sizeof(a3[0]);i++)
	{
		printf("%d ",a3[i]);
	}
}
int main()
{
	test();
	system("pause");
	return 0;
}

结果:

wKioL1cu67zwDNM6AAAkq1cecHI687.png