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

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

    方法一:可以用两个指针,分别指向数组的前后(下面称两个指针为头指针和尾指针),头指针向下遍历,遇到偶数时停下,尾指针从尾向前遍历,直到遇到一个奇数,交换当前头尾指针所指的值,之后头指针继续遍历,直到头尾指针所指相同,这样便可实现,代码如下:

 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 }
原文地址:https://www.cnblogs.com/yangrenzhi/p/5780339.html