剑指Offer - 面试题21:调整数组顺序使奇数位于偶数前面

Posted 林夕07

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer - 面试题21:调整数组顺序使奇数位于偶数前面相关的知识,希望对你有一定的参考价值。

题目

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

分析

暴力法

最简单能想到的就是从前到后依次遍历若发现是偶数,先保存当前元素,将后面全部往前移动,然后把保存的元素给到最后那个位置。时间复杂度为O(n2),空间复杂度为O(1);

C

#include<stdio.h>
#include<assert.h>

//暴力法

void ReordeOddEven(int* pData, unsigned int length)
{
    assert(NULL != pData);
    assert(length > 0);
    int i = 0;
    int j = 0;
    
    for(i = 0; i < length; i++)
    {
        if((pData[i] & 1) == 0)//&优先级低于==所以务必加括号,否则永远不成立
        {    
            int tmp = pData[i];
            for(j = i; j < length - 1; j++)
            {
                pData[j] = pData[j + 1];
            }
            pData[j] = tmp;
        }
    }
}

void Print(int* n, int length)
{
    int i = 0;
    for(i = 0; i < length; i++)
    {
        printf("%d ", n[i]);
    }
    printf("\\n");
}

int main()
{
    int n[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int length = sizeof(n) / sizeof(n[0]);

    ReordeOddEven(n, length);
    Print(n, length);
    return 0;
}

在这里插入图片描述

双指针

我们还可以用俩个指针。分别指向头和尾巴。
在这里插入图片描述
让start指针向后走找偶数,让end指针向前走找奇数。循环条件:start<end
C

#include<stdio.h>
#include<assert.h>

void swap(int* n , int i, int j)
{
    int tmp = n[i];
    n[i] = n[j];
    n[j] = tmp;
}


void ReordeOddEven(int* pData, unsigned int length)
{
    assert(NULL != pData);
    assert(length > 0);
    int start = 0;
    int end = length - 1;
    
    while(start < end)
    {
        while(start < end && (pData[start] & 1) == 1)//如果是奇数就一直找
        {
            start++;
        }

        while(start < end && (pData[end] & 1) == 0)//如果是偶数就一直找
        {
            end--;
        }
        
        if(start < end)
        {
            swap(pData, start, end);
        }
    }
}

void Print(int* n, int length)
{
    int i = 0;
    for(i = 0; i < length; i++)
    {
        printf("%d ", n[i]);
    }
    printf("\\n");
}

int main()
{
    int n[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int length = sizeof(n) / sizeof(n[0]);

    ReordeOddEven(n, length);
    Print(n, length);

    return 0;
}

在这里插入图片描述

具有扩展性的双指针

在这里插入图片描述
分析上面代码我们发现核心就只有俩段代码(pData[start] & 1)(pData[end] & 1),我们把这个代码封装成一个函数,这个地方直接调用封装好的函数就ok了。
C

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>

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

void swap(int* n, int i, int j)
{
    int tmp = n[i];
    n[i] = n[j];
    n[j] = tmp;
}

void ReordeOddEven(int* pData, unsigned int length)
{
    assert(NULL != pData);
    assert(length > 0);

    int start = 0;
    int end = length -1;
    
    while(start < end)
    {
        while(start < end && func(pData[start])  == false)
        {
            start++;
        }

        while(start < end && func(pData[end]) == true)
        {
            end--;
        }

        if(start < end)
        {
            swap(pData, start, end);
        }
    }
}

void Print(int* n, int length)
{
    int i = 0;
    
    for(i = 0; i < length; i++)
    {
        printf("%d ", n[i]);
    }
    printf("\\n");
}

int main()
{
    int n[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int length = sizeof(n) / sizeof(n[0]);
    
    ReordeOddEven(n, length);
    Print(n, length);

    return 0;
}

在这里插入图片描述

本章完!

以上是关于剑指Offer - 面试题21:调整数组顺序使奇数位于偶数前面的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer - 面试题21:调整数组顺序使奇数位于偶数前面

剑指offer 面试21题

剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

剑指Offer面试题 九度OJ1516:调整数组顺序使奇数位于偶数前面

剑指Offer面试题 九度OJ1516:调整数组顺序使奇数位于偶数前面

《剑指offer》第二十一题:调整数组顺序使奇数位于偶数前面