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

算法思想很简单:
我们定义两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动。第二个指针初始化时指向数组的最后一个数字,它只向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数,第二个指针指向的数字是奇数,则交换这两个数字

#include<iostream>
using namespace std;


void ReorderOddEven(int *pData,unsigned int length)
{
   if(pData==NULL ||length==0)
   {
      return;
   }
   int *pBegin=pData;
   int *pEnd=pData+length-1;
   while(pBegin<pEnd)
   {
      while(pBegin<pEnd && (*pBegin & 0x1)!=0)
      {
          pBegin++;
      }
      while(pBegin<pEnd && (*pEnd & 0x1)==0)
      {
          pEnd--;
      }
      if(pBegin<pEnd)
      {
          int temp=*pBegin;
          *pBegin=*pEnd;
          *pEnd=temp;
      }
   }
}



int main()
{
    int a[]={2,6,8,3,5,0,2,5,7,3,8,6,4,9,7,4,6,9};
    unsigned int length=sizeof(a)/sizeof(int);
    ReorderOddEven(a,length);
    for(int i=0;i<length;i++)
    {
        cout<<a[i]<<"  ";
    }

    system("pause");
    return 0;
}

该程序有一种可以扩展性的解法:
即把该问题的判断标准单独拿出来实现

void Reorder(int *pData,unsigned int length)
{
    if(pData==NULL || length==0)
    {
        return;
    }
    int *pBegin=pData;
    int *pEnd=pData+length-1;
    while(pBegin<pEnd)
    {
        while(pBegin<pEnd && !func(*pBegin))
        {
            pBegin++;
        }
        while(pBegin<pEnd && func(*pEnd))
        {
            pEnd--;
        }
        if(pBegin<pEnd)
        {
        int temp=*pBegin;
        *pBegin=*pEnd;
        *pEnd=temp;
        }
    }
}


bool isEven(int n)
{
   return (n & 1)==0;
}

此时该函数就是根据func的标准把数组pData分成了两部分,而函数isEven则是一个具体标准。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值