题目:

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

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

程序1.0:

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

voidReorderOddEven(int*pData,size_tlength){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

voidReorderOddEven(int*pData,size_tlength){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里的循环条件改一下就可以

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

voidReorderOddEven(int*pData,size_tlength,bool(*func)(int)){assert(pData);assert(length);Reorder(pData,length,isEven);}voidReorder(int*pData,size_tlength,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);}}}boolisEven(intn){return(n&0x1)==0;}

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