调整数组,使得奇数在前偶数在后

题目要求:输入一个整数数组,实现一个函数,来该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
分析:

最常用的的双指针法,设置两个指针p1,p2初始化指向数组的第一个数和数组的最后一个数。总的有以下四种情况

    (1)如果p1指向的数为奇数则p1向后移到一位,如果p2指向的数是偶数则p2向前移到一位。

    (2)如果p1指向的数为奇数则p1向后移到一位,如果p2指向的数为奇数则p2不变。

    (2)如果p1指向的数为偶数,p2指向的数是奇数;则此时把p1和p2两个值交换,p1向后移到一位p2向前移到一位

    (3)如果p1指向的数为偶数,p2指向的数是偶数;则p1不变p2往前移到一位。

 举例:数组{2,0,1,3,4,5}

(1)第一次数组如下所示,发现p1指向为偶数p2指向为奇数,则交换p1和p2的值

(2)第二次如图所示,发现p1指向的值为偶数则p1不变,p2指向为偶数,则p2向前移到一位

(3)第三次如图所示 ,p1指向偶数,p2指向奇数则p1和p2值交换,p1向后移到一位,p2向前移到一位

(4)第四次如图所示,发现p1和p2指向同一位置,说明以及把数组调整为奇数在前偶数在后

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
#include<assert.h>
void Adj(int *p, int n)
{
	int *q = p+n - 1//数组尾元素地址
	int tmp;
	assert(p != NULL);//断言 P不为空指针
	while (p<q)
	{
		while ((*p & 1) == 1)//当前面的数为偶数时
		{
			p++;
			while ((*q & 1) == 0)//当后面的数为奇数时
			{
				q--;
			}
			if (p<q)//在满足条件下交换奇数和偶数的位置
				{
				tmp = *p;
				*p = *q;
				*q = tmp;
				}
			}
	}
	return;
}
int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,0};
	int i;
	int sz = sizeof(arr) / sizeof(arr[0]);
	Adj(&arr,sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d \n", arr[i]);
	}

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39412582/article/details/79195567