数据结构-调整数组顺序使奇数位于偶数前面

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

分析:首先想到的是进行遍历,然后移到后面,但是效率O(n^2)。所以考虑使用首尾指针,可进行直接交换数据。但是这里考虑一下拓展性。

/*
剑指offer面试题14
*/
#include <iostream>

using namespace std;
/*
void ReorderOddEven(int* a,int low,int high){
    if(a == NULL || high <= low){
        return;
    }

    while(high > low){
        while(a[low] & 1){
            low++;
        }
        while(!(a[high] & 1)){
            high--;
        }
        if(low - high == 1){
            break;
        }
        int tmp = a[low];
        a[low] = a[high];
        a[high] = tmp;
    }
}
*/

/*
上面注释的代码,为常规的实现方法。
下面是可拓展的代码。例如题目换成前半部是可以除于3或者是正数
这会只需要改下IsEven函数
*/
bool IsEven(int n){
    return (n & 1) == 0;
}

void ReOrder(int* a,int low,int high,bool (*func)(int)){
    if(a == NULL || high <= low){
        return;
    }

    while(high > low){
        while(!func(a[low]) && high > low){
            low++;
        }
        while(func(a[high]) && high > low){
            high--;
        }
        if(low - high == 1){
            break;
        }
        int tmp = a[low];
        a[low] = a[high];
        a[high] = tmp;
    }
}

void ReorderOddEven(int* a,int low,int high){
    ReOrder(a,low,high,IsEven);
}

int main()
{
    int a[] = {1,5,2,1,4,1,5,6,1,5,2,1};
    int n = sizeof(a)/sizeof(*a);

    ReorderOddEven(a,0,n-1);

    for(int i=0;i<n;i++){
        cout << a[i] << " ";
    }

    return 0;
}
原文地址:https://www.cnblogs.com/wn19910213/p/3722119.html