zoukankan      html  css  js  c++  java
  • 数组中奇数全部放到偶数前。

    (1)、将数组A[0.....n]中所有的奇数移到所有偶数前,要求不增加存储空间,且时间复杂度为O(n)

    //算法分析:**设置两个指针i,j。其中i从左往右,j从右往左。当i指向偶数,j指向奇数时交换两个位置的值。当i>j时结束。**
    void MoveForward(int a[],int n)
    {
        int i=0;
        int j=n-1;
        int temp;
        while(i<j)
        {
            while(a[i]%2==1&&i<j)
                i++;
            while(a[j]%2==0&&i<j)
                j--;
            if(i<j)
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
                i++;
                j--;
            }
        }
        for(i=0;i<n;i++)
        {
            cout<<' '<<a[i];
        }
    }
    

    注:以上解法来自天勤。
    我的思路:使用i依次按位置访问元素值,若为偶数在后面找到一个奇数交换,若为奇数就跳过。

    void MoveForward1(int a[],int n)
    {
        int i=0;
        int j;
        int temp;
        while(i<n)//i用来遍历整个数组
           {
                if(a[i]%2==0)//判断是奇数,本来在此处if后面加了一个else判断偶元素时从后面找奇数替换,然后意识到是费操作。
                    {
                        for(j=i+1;j<n;j++)//从当前元素的后面寻找奇数元素。
                        {
                            if(a[j]%2==1)
                            {
    
                                temp=a[i];
                                a[i]=a[j];
                                a[j]=temp;//交换后面的偶数这一轮的奇数。
                                break;
                            }
                        }
                    }
                i++;
            }
            for(i=0;i<n;i++)
                cout<<" "<<a[i];
    }
    


    这就做出来了,之前还做了交换前面的奇数到后面的偶数这样的费操作,增加了循环的次数,如果遇到奇数直接就可以不理会。往后寻找偶数。

  • 相关阅读:
    Java 面向对象(十二)类的成员 之 代码块
    Java 关键字:static
    Java 常用类(二):包装类(Wrapper)
    Java 之 clone 方法(对象拷贝)
    SQL分组聚合查询
    Rabbitmq消息持久化
    idea 插件
    TCP粘包,拆包及解决方法
    redis内存淘汰策略及如何配置
    MySQL存储过程/存储过程与自定义函数的区别
  • 原文地址:https://www.cnblogs.com/jearchen/p/9818962.html
Copyright © 2011-2022 走看看