面试题21:调整数组顺序使奇数位于偶数前面 C++

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

分析:
1.直接法O(n^2)
2.前后指针交替法O(n) , 类似快速排序

#include <iostream>      
using namespace std;

void reorder(int *pData, int length)
{
    if (pData == nullptr || 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;
        }

    }
}
 
void print_array(int *pData, int length)
{
    for (int i = 0; i < length; i++)
    {
        cout << pData[i] << ' ';
        if (i == length - 1)
            cout << endl;
    }
}

int main() {
     
    int length;
    cin >> length;
    int *pData=new int[length];
    memset(pData, 0, length*sizeof(pData));
    for (int i = 0; i < length; i++)
         cin >> pData[i];
    cout << "origin : ";
    print_array(pData, length);
    
    reorder(pData, length);

    cout << "reorder : ";
    print_array(pData, length);


    return 0;
}
test

扩展:注意func作为函数形参bool (*func)(int)

#include <iostream>      
using namespace std;

void reorder(int *pData, int length,bool (*func)(int))
{
    if (pData == nullptr || 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 & 0x1) == 0);
}
void print_array(int *pData, int length)
{
    for (int i = 0; i < length; i++)
    {
        cout << pData[i] << ' ';
        if (i == length - 1)
            cout << endl;
    }
}

int main() {
     
    int length;
    cin >> length;
    int *pData=new int[length];
    memset(pData, 0, length*sizeof(pData));
    for (int i = 0; i < length; i++)
         cin >> pData[i];
    cout << "origin : ";
    print_array(pData, length);
    
    reorder(pData, length,isEven);

    cout << "reorder : ";
    print_array(pData, length);


    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 小猪导航是什么平台?它的特点就是,微商的聚集地。有人发文,有人分享干货。更多的,是一群微商小白,在上面学习。 小猪...
    那样花阅读 6,876评论 0 0
  • 冬去塞北物华新, 春归山南行雨润。 乍暖还寒疯三月, 一树蓓蕾笑盈门。
    瀚正阅读 1,387评论 0 5
  • 三月已近尾声,一直以为油菜花盛开于四月,下班无意瞥见附近农户的油菜花,几亩地金灿灿一片,倒是把寡淡的夕阳...
    炎炎冬日阅读 4,312评论 0 1
  • #幸福是需要修出来的~每天进步1%~幸福实修09班~01~蔷薇 20170905(19/49)09班 【幸福两朵玫...
    幸福实修蔷薇阅读 1,535评论 0 0

友情链接更多精彩内容