调整一个数组中的偶数位于奇数的后面

本文介绍如何通过编程实现一个功能,将数组中的所有偶数元素移动到奇数元素之后,同时保持原有顺序不变。这种方法涉及到数组遍历和元素交换,适合初学者了解基本的数组操作技巧。
摘要由CSDN通过智能技术生成
#include <iostream>

using namespace std;

#include "vector"


/* 麻烦的方法:1. 首先确定奇数的个数
             2. 然后开始从第一个位置扫描如果遇到偶数,则从这个位置开始后的所有数向前移动一个位置,如果遇到奇数则跳过
             3. 循环的结束条件为从头开始指向的指针移动的位置数目等于奇数的个数*/

void doShuzu(vector<int> & a){


    int i = 0;

    int length = a.size() - 1;

    int jishu = 0;


    while (i <= length) {

        if((a[i] & 0x1) == 1)

            jishu++;

        i++;
    }

    i = 0;

    while(i != jishu){

        if((a[i]& 0x1) == 0){

            int temp = a[i];

            for(int j = i; j < length; j++){

                a[j] = a[j + 1];
            }

            a[length] = temp;

        }else

            i++;

    }

}

/* 简单的方法:1. 使用两个指针,第一个指针指向数组的第一个位置,第二个指针指向数组的结尾,只向前移动。
             2. 在两个指针相遇之前,第一个指针永远在第二个指针的前面,如果第一个指针指向的是偶数,第二个指针指向的是奇数,则交换两个数组
             */
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 & 0x1) == 1 && pBegin < pEnd) {
            pBegin++;
        }

        while ((*pEnd & 0x1) == 0 && pBegin < pEnd) {
            pEnd--;
        }

        if(pBegin < pEnd){

            *pBegin = *pBegin + *pEnd;

             *pEnd =   *pBegin - *pEnd;

            *pBegin = *pBegin - *pEnd;


        }
    }

}

/* 抽象:1. ORder 根据 func 的标准把数组 pData 分成两部分
        2. isEven 则是一个具体的标准,即判断一个数是不是偶数。
 */


bool isEven(int n){

    return (n & 1) == 0;
}

void Reorder(int *pData,unsigned int length, bool (*func) (int)){

    if(pData == NULL || length == 0)

        return;

    int *pBegin = pData;

    int *pEnd = pData + length - 1;

    while (pBegin < pEnd) {

        while ((*pBegin & 0x1) == 1 && !func(*pBegin)) {
            pBegin++;
        }

        while ((*pEnd & 0x1) == 0 && func(*pEnd)) {
            pEnd--;
        }

        if(pBegin < pEnd){

            *pBegin = *pBegin + *pEnd;

            *pEnd =   *pBegin - *pEnd;

            *pBegin = *pBegin - *pEnd;


        }
    }

}


int main(int argc, const char * argv[]) {
    // insert code here...

    vector<int> a ;

    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    a.push_back(5);
    a.push_back(6);
    a.push_back(7);

    int a1[6] = {1,2,3,4,5,6};

    //doShuzu(a);

    //ReorderOddEven(a1, 6);

    Reorder(a1, 6, isEven);

    for (int i =0 ; i < 6; i++) {
        cout<<a1[i]<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值