题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
方法一:可以用两个指针,分别指向数组的前后(下面称两个指针为头指针和尾指针),头指针向下遍历,遇到偶数时停下,尾指针从尾向前遍历,直到遇到一个奇数,交换当前头尾指针所指的值,之后头指针继续遍历,直到头尾指针所指相同,这样便可实现,代码如下:
1 #include<iostream> 2 3 void Reorder(int *pData,unsigned int length){ 4 if(pData==NULL||length<=0) 5 return; 6 int *pHead = &pData[0]; 7 int *pEnd = &pData[length-1]; 8 while(pHead < pEnd){ 9 while(pHead < pEnd && (*pHead&0x1) != 0) 10 pHead++; 11 while(pHead < pEnd && (*pEnd&0x1) == 0) 12 pEnd--; 13 if(pHead < pEnd){ 14 *pHead ^= *pEnd; 15 *pEnd ^= *pHead; 16 *pHead ^= *pEnd; 17 } 18 } 19 } 20 21 int main(){ 22 int a[5]={1,2,3,4,5}; 23 Reorder(a,5); 24 for(int i=0;i<5;i++){ 25 std::cout<<a[i]<<" "; 26 } 27 return 0; 28 }
方法二:对于上面程序的优化,要使程序可扩展性强,能够解决这一类的问题(如非负数在前,负数在后;能被3整除在前,不能被3整除的在后等等),只需要将while中的判断标准提取出来,写成一个函数,用函数指针来指向对应的判断函数即可。
1 #include<iostream> 2 3 bool isEven(int n){ 4 return (n & 1) == 0; 5 } 6 7 void Reorder(int *pData,unsigned int length,bool (*func)(int)){ 8 if(pData==NULL||length<=0) 9 return; 10 int *pHead = &pData[0]; 11 int *pEnd = &pData[length-1]; 12 while(pHead < pEnd){ 13 while(pHead < pEnd && !func(*pHead)) 14 pHead++; 15 while(pHead < pEnd && func(*pEnd)) 16 pEnd--; 17 if(pHead < pEnd){ 18 *pHead ^= *pEnd; 19 *pEnd ^= *pHead; 20 *pHead ^= *pEnd; 21 } 22 } 23 } 24 25 int main(){ 26 int a[5]={1,2,3,4,5}; 27 Reorder(a,5,isEven); 28 for(int i=0;i<5;i++){ 29 std::cout<<a[i]<<" "; 30 } 31 return 0; 32 }