码迷,mamicode.com
首页 > 编程语言 > 详细

调整数组顺序使奇数位于偶数前面

时间:2017-06-19 22:16:13      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:comm   ide   lin   include   ack   奇数位于偶数前面   clu   markdown   观察   

【题目】

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


【分析】

比較直接的笨方法就是遍历每个,仅仅要是偶数,就拿出来,将后面的数依次往前挪动,将偶数填放在数组的最后方,每碰到一个偶数就要挪动o(n)个数字,那么总的时间复杂度就是O(n^2),效率太低,怎样改善。能够观察数组假设要奇数位于偶数之前,也就是顺序颠倒的要换过来。从两头往中间遍历的方法比較简单,仅仅要不符合奇在偶前,那么就要颠倒,否则就往中间继续查找遍历,直到发现全部都满足条件。


举例分析,数组{1。2,3,4,5}。终于想得到的是奇数在前。偶数在后,这里不关注排序的问题,所以,參考以下过程图就可理解怎么高速调整顺序。

技术分享
终于得到的结果就是{1,5。3,4,2}


【測试代码】

#include<stdio.h>
void swap(int *p1, int *p2)
{

}

void reorder_odd_even(int *p,  int length)
{
    int *p1 = p;
    int *p2 = p+length - 1;

    while(p1<p2)
    {
        while(( *p1 & 0x1 !=0 )&&(p1<p2))
            p1++;
        while((*p2&0x1) == 0 && (p1<p2))
            p2--;
        if(p1<p2)
            {
                int temp = *p1;
                *p1 = *p2;
                *p2 = temp;
        }
    }

}
void print(int s[],int length)
{
    for(int i = 0; i<length; i++)
        printf("%d",s[i]);
}
int main()
{
    int s[ ] = {1,2,3,4,5};
    reorder_odd_even(s,5);
    print(s,5);
    return 0;
}

【延伸】
假设此题目做一下变化,比方把筛选条件换成让全部能被3整除的位于不能被3整除的前面,或者满足负数在非负数前面等。上面的代码对应部分的筛选条件就随要求变化就可以,可是,怎么能让我们的程序普适性更好呢,就是相似的这种问题用我们的代码就直接能够解决,不用老是改动,能想到的是将筛选条件提取出来单独成为一个函数。在这測试代码仅仅须要调用你要推断的条件函数就能够了,无需更改,于是,我们改写出了例如以下代码:

#include<stdio.h>

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

void reorder(int *p,  int length,bool (*func)(int))
{
    int *p1 = p;
    int *p2 = p+length - 1;

    while(p1<p2)
    {
        while(!func(*p1)&&(p1<p2))
            p1++;
        while(func(*p2) && (p1<p2))
            p2--;
        if(p1<p2)
            {
                int temp = *p1;
                *p1 = *p2;
                *p2 = temp;
        }
    }

}

void reorder_odd_even(int s[], int length)
{
    reorder(s,length,isEven);
}

void print(int s[],int length)
{
    for(int i = 0; i<length; i++)
        printf("%d",s[i]);
}

int main()
{
    int s[ ] = {1,2,3,4,5};
    reorder_odd_even(s,5);
    print(s,5);
    return 0;
}

调整数组顺序使奇数位于偶数前面

标签:comm   ide   lin   include   ack   奇数位于偶数前面   clu   markdown   观察   

原文地址:http://www.cnblogs.com/yutingliuyl/p/7050478.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!