zoukankan      html  css  js  c++  java
  • 数组中,奇数放前偶数放后

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

    错误代码:

    public class Solution {
        public void reOrderArray(int [] array) {
            int len=array.length;
            for(int i=0;i<len;i++){
                if((array[i]&1)==0){
                    int j;
                    for(j=i;j<len-1;j++)
                        array[j]=array[j+1];
                    int temp;
                    temp=array[i];
                    array[j]=temp;
                    i--;
                }
            }
        }
    }

    这段代码,i--  这个语句,会导致死循环。因为,到了数组某一阶段,i及其以后全是偶数,会一直循环,而且破坏稳定性。

    改正:

    public class Solution {
        public void reOrderArray(int [] array) {
            int len=array.length;
            int k=0;
            for(int i=0;i<len-k;i++){
                int temp;
                temp=array[i];
                if((array[i]&1)==0){
                    int j;
                    for(j=i;j<len-1;j++)
                        array[j]=array[j+1];
                    array[j]=temp;
                    i--;
                    k++;
                }
            }
        }
    }

     这段代码,增加一个k,限制i的循环次数。关键是,i不需要遍历到最后。另外,如果想要让奇数向前,可以仿照上述代码,从后面遍历。

    再有,完全仿照直接插入排序,奇数向前,同时从0遍历,注意一点:找到奇数后,要从第一个偶数开始向后搬运,再将奇数插入到原来第一个偶数的位置。

    public class Solution {
        public void reOrderArray(int [] array) {
            int len=array.length;
            for(int i=0;i<len;i++){
                if((array[i]&1)==1){
                    int k=0;
                    while((array[k]&1)==1&&k<i) k++;   //找到前面第一个偶数
                    if(k<i){
                        int temp=array[i];
                        int j;
                        for(j=i;j>k;j--)
                            array[j]=array[j-1];
                        array[j]=temp; 
                    }
                }
            }                   
        }
    }

    以上的时间复杂度是O(n²),如果再借用一个数组,将偶数放进去,然后再复制到原来的数组中,可实现时间复杂度为O(n)的算法

  • 相关阅读:
    iOS SQLite函数总结
    转-NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
    NSUserDefaults保存用户名和密码
    iOS 集成银联支付(绕过文档的坑,快速集成)-转
    iOS微信支付
    iOS生成PDF的关键代码-备忘
    python中的urlencode和urldecode
    python中%r和%s的区别
    ubuntu16.04安装wps
    二进制、八进制、十进制、十六进制之间的转换
  • 原文地址:https://www.cnblogs.com/heyboom/p/8653827.html
Copyright © 2011-2022 走看看