zoukankan      html  css  js  c++  java
  • 调整数组顺序使奇数位于偶数前面

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

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

     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 }
  • 相关阅读:
    【HDU3681】Prison Break-状态压缩DP+BFS+二分答案
    【BashuOJ3520】警察局长-最短路树+树上背包+概率DP
    【POJ1201】Intervals-差分约束系统+单源最长路
    【BashuOJ2041】最大矩形-矩阵型DP
    【BashuOJ2041】最大矩形-矩阵型DP
    deleted
    deleted
    deleted
    deleted
    deleted
  • 原文地址:https://www.cnblogs.com/yangrenzhi/p/5780339.html
Copyright © 2011-2022 走看看