剑指Offer算法实现之十四:调整数组顺序使奇数在偶数前面

来源:互联网 发布:java 流程图框架 编辑:程序博客网 时间:2024/06/04 19:43

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

思路:

类似于快速排序的分区函数。可在线性时间内完成

编译环境:ArchLinux+Clang3.3,C++11

实现一:双指针两端扫描交换法

#include <iostream>using namespace std;void reorder_oddeven(int *a, unsigned len){    if ( !a || len <= 0)        return;    int *pFirst = a;    int *pLast = a + len - 1;    while (pFirst < pLast) {        while (pFirst < pLast && (*pFirst&0x1)) pFirst++; //后移到第一个偶数        while (pFirst < pLast && !(*pLast&0x1)) pLast--; //前移到第一个奇数        if (pFirst < pLast)            swap(*pFirst, *pLast); // 交换偶奇数    }}int main(){    int a[]{1,2,3,4,5,6};    reorder_oddeven(a, sizeof(a)/sizeof(int));    for (auto i : a) {        cout << i << '\t';    }}
实现二:使用C++11的Lambda表达式扩展

#include <iostream>#include <functional>using namespace std;/* 参数predicate为lambda表达式 */void reorder(int *a, unsigned len, function<bool (int)> predicate){    if ( !a || len <= 0)        return;    int *pFirst = a;    int *pLast = a + len - 1;    while (pFirst < pLast) {        while (pFirst < pLast && predicate(*pFirst)) pFirst++; // 调用谓词(lambda表达式)判断        while (pFirst < pLast && !predicate(*pLast)) pLast--;        if (pFirst < pLast)            swap(*pFirst, *pLast);    }}int main(){    int a[]{1,2,3,4,5,6};    reorder(a, sizeof(a)/sizeof(int), [](int x){return x&0x1;}); // 匿名lambda    for (auto i : a) {        cout << i << '\t';    }}



原创粉丝点击