• 033 调整数组顺序使奇数位于偶数前面(keep it up)


    剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1516

    题目描写叙述:

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得全部的奇数位于数组的前半部分。全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

    输入:

    每一个输入文件包括一组測试案例。


    对于每一个測试案例,第一行输入一个n,代表该数组中数字的个数。


    接下来的一行输入n个整数。代表数组中的n个数。

    输出:

    相应每一个測试案例,
    输入一行n个数字。代表调整后的数组。

    注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。

    例子输入:
    5
    1 2 3 4 5
    
    例子输出:
    1 3 5 2 4
    这个题有点棘手。假设想用时间复杂度为o(N),空间复杂度就会非常高。
    假设用时间复杂度为o(n^2),空间复杂低。

    先看空间复杂度3n。时间复杂度为n的代码:

    #include <stdio.h>
     
    #define MAXSIZE 100000
     
    int Array[MAXSIZE];
    int EvenIndex[MAXSIZE];
    int OddIndex[MAXSIZE];
     
    int main()
    {
        int i;
        int N;
        int EvenCount;
        int OddCount;
     
        while (scanf("%d", &N) != EOF)
        {
            EvenCount = 0;
            OddCount  = 0;
     
            for (i = 0; i < N; ++i)
            {
                scanf("%d", Array+i);
     
                if (Array[i] % 2 == 0) EvenIndex[EvenCount++] = i;
                else OddIndex[OddCount++] = i;
            }
     
            for (i = 0; i < OddCount-1; ++i)
            {
                printf("%d ", Array[OddIndex[i]]);
            }
     
            if (OddCount > 0)
            {
                printf("%d", Array[OddIndex[OddCount-1]]);
                if (EvenCount > 0) printf(" ");
            }
     
            for (i = 0; i < EvenCount-1; ++i)
            {
                printf("%d ", Array[EvenIndex[i]]);
            }
     
            if (EvenCount > 0)
            {
                printf("%d
    ", Array[EvenIndex[EvenCount-1]]);
            }
        }
     
        return 0;
    }
    /**************************************************************
        Problem: 1516
        User: 
        Language: C
        Result: Accepted
        Time:70 ms
        Memory:2084 kb
    ****************************************************************/

    时间复杂度为n^2的,超时:

    #include <stdio.h>
     
    #define MAXSIZE 100000
     
    int Array[MAXSIZE];
     
    void test4(int vArray[], int vLen)
    {
        int i;
        int k;
        int Temp;
     
        for (i = 0; i < vLen; ++i)
        {
            if (vArray[i] % 2)
            {
                for (k = i-1; k >= 0; --k)
                {
                    if (vArray[k] % 2) break;
                    if (vArray[k] % 2 == 0)
                    {
                        Temp = vArray[k+1];
                        vArray[k+1] = vArray[k];
                        vArray[k] = Temp;
                    }
                }
            }
        }
     
        for (i=0 ; i < vLen-1; ++i)
        {
            printf("%d ", vArray[i]);
        }
     
        printf("%d
    ", vArray[vLen-1]);
    }
     
    int main()
    {
        int i;
        int N;
     
        while (scanf("%d", &N) != EOF)
        {
            for (i = 0; i < N; ++i)
            {
                scanf("%d", &Array[i]);
            }
     
            test4(Array, N);
        }
     
        return 0;
    }
    /**************************************************************
        Problem: 1516
        User:
        Language: C
        Result: Time Limit Exceed
    ****************************************************************/




  • 相关阅读:
    【】130个好的资源网站
    c++输出控制字体颜色
    【】程序员经典面试题
    c语言链表——模拟链表
    c语言链表——链表
    一些Markdown编辑器
    【】如何评价Github发布的文本编辑器atom?
    遍历简单XML节点
    jQuery重要插件!
    nvarchar与varchar的区别
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7290157.html
Copyright © 2020-2023  润新知