题目:
成都创新互联长期为上1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为靖安企业提供专业的成都网站设计、成都网站制作,靖安网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分
程序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的内容来改变整体函数的条件,增加了函数的可移植性和健壮性