数组元素的分类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组元素的分类相关的知识,希望对你有一定的参考价值。

题目:

调整数组顺序使奇数位于偶数前面

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

程序1.0:

使用两个指针一个指向头一个指向尾,如果头指针遇到奇数就后移,遇到偶数就和尾指针指向的元素交换,头指针交换完成后后移,尾指针交换完成后前移,当两指针指向同一地址交换结束

void ReorderOddEven(int *pData, size_t length)
{
	assert(pData);
	assert(length);
	int*pHead = pData;
	int*pTail = pData + length - 1;
	while (pHead != pTail)
	{
		if ((*pHead & 0x1) == 0)//为偶数
		{
			swap(*pHead, *pTail);
			pTail--;
		}
		pHead++;
	}
}

程序1.1

void ReorderOddEven(int *pData, size_t length)
{
	assert(pData);
	assert(length);

	int *pHead = pData;
	int*pTail = pData + length - 1;

	while (pHead < pTail);
	{
		while (((*pHead & 0x1) != 0) && (pHead < pTail))//前面数若为奇数
		{
			pHead++;
		}
		while (((*pHead & 0x1) == 0) && (pHead < pTail))//若后面的数为偶数
		{
			pTail--;
		}
		if (pHead < pTail)
		{
			swap(*pHead, *pTail);
		}
	}
}

程序2.0

若要把题目改为:将正数放到负数前面或者改为将能被三整除的数放到不能被三整数的数的前面只需要将while里的循环条件改一下就可以

但是,若想要一个通用的模板呢?(即不要改变函数,只改变判断条件)

void ReorderOddEven(int *pData, size_t length, bool(*func)(int))
{
	assert(pData);
	assert(length);

	Reorder(pData, length, isEven);
}
void Reorder(int *pData, size_t length, bool(*func)(int))
{
	int *pHead = pData;
	int*pTail = pData + length - 1;

	while (pHead < pTail);
	{
		while (((*pHead & 0x1) != 0) && !func(*pHead))//前面数若为奇数
		{
			pHead++;
		}
		while (((*pHead & 0x1) == 0) && func(*pTail))//若后面的数为偶数
		{
			pTail--;
		}
		if (pHead < pTail)
		{
			swap(*pHead, *pTail);
		}
	}
}
bool isEven(int n)
{
	return (n & 0x1) == 0;
}

    这样,就可以通过改变函数isEven的内容来改变整体函数的条件,增加了函数的可移植性和健壮性


本文出自 “无以伦比的暖阳” 博客,请务必保留此出处http://10797127.blog.51cto.com/10787127/1774398

以上是关于数组元素的分类的主要内容,如果未能解决你的问题,请参考以下文章

为什么我不能在此片段中生成唯一对象数组?

解释'空'C数组(int a = {};)

数据结构:八大数据结构分类

JavaScript笔试题(js高级代码片段)

三指针(三指针排序只有三种元素的数组)--12--三指针--颜色分类

JS常用代码片段-127个常用罗列-值得收藏