剑指offer:调整数组顺序

题目:调整数组顺序,使奇数位于偶数前面。

输入一个整形数组,实现一个函数调整数组中数字顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

整体思路

思路1

     扫描数组,前指针指向第一个数字,向后走;后指针指向最后一个数字,向前走,若偶数在奇数前面,交换这两数字。

代码

#include<stdio.h>

void ReoederOddEven(int *pData, unsigned int length)
{
	if (pData == NULL || length == 0)
	{
		return;
	}
	int *pBegin = pData;
	int *pEnd = pData + length - 1;

	while (pBegin < pEnd) // *pBegin  *pEnd 代表里面的数字
	{
		
		while (pBegin < pEnd && (*pBegin & 0x1)!=0) //向后移动begin,直到它指向偶数
		{
			pBegin++;
		}
		
		while (pBegin < pEnd && (*pEnd & 0x1)==0)//向前移动pEnd,直到它指向奇数
		{
			pEnd--;
		}
		if (pBegin < pEnd) // 交换偶数和奇数
		{
			int t = *pBegin;
			*pBegin = *pEnd;
			*pEnd = t;
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5 };
	ReoederOddEven(arr, sizeof(arr) / sizeof(arr[0]));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

运行结果

1     5     3     4    2

思路2

      函数指针写法,可提高扩展性
      为了让代码的扩展性更强,可以将这些判断标准单独写成一个函数接口,而主代码框架保持不变。
      将逻辑框架抽象出来,把判断标准变成一个函数指针,也就是用一个函数来判断数字是不是符合标准。

代码: 

#include<stdio.h>

bool isEven(int n);
void ReoederOddEven(int *pData, unsigned int length);
void Reorder(int *pData, unsigned int length, bool(*func)(int));

bool isEven(int n)//  1&1  奇数 1==0 ?  1≠0  返回 0  说明是奇数   
{
	return(n & 1) == 0;
}


//把函数指针当成一个参数,声明了一个指针func,指向了函数 调用 func(3,4)或(*func)(3,4)
void Reorder(int* pData, unsigned int length, bool(*func)(int))
{
	if(pData==NULL||length==0)
	{
		return;
	}

	int *pBegin = pData;
	int *pEnd = pData + length - 1;

	while (pBegin < pEnd) // *pBegin  *pEnd 代表里面的数字
	{
        // !func(*pBegin)表示 *pBegin %2 != 0 
		while (pBegin < pEnd && !func(*pBegin)) //向后移动begin,直到它指向偶数
		{
			pBegin++;
		}
		// func(*pEnd) 表示 *pEnd % 2 == 0
		while (pBegin < pEnd && func(*pEnd))// 向前移动pEnd,直到它指向奇数
		{
			pEnd--;
	    }
		if (pBegin < pEnd) // 交换偶数和奇数
		{
			int t = *pBegin;
			*pBegin = *pEnd;
			*pEnd = t;
		}
	}
}

void ReoederOddEven(int *pData, unsigned int length)
{
	Reorder(pData, length, isEven);
}

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	ReoederOddEven(arr1, sizeof(arr1)/sizeof(arr1[0]));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	return 0;
}

运行结果

1     5     3     4    2

猜你喜欢

转载自blog.csdn.net/free377096858/article/details/84235499