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

题目描述

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

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


思路分析

            针对题目一,不要求调整后的数组奇数和偶数的相对位置不变,有两种比较直观的解法:

    (1)从头遍历这个数组,遇到一个偶数时就拿出这个数字,并把位于这个数字后面的所有数字前移,将该偶数放入数组的末尾,该解法的时间复杂度为O(n2)。

    (2)采用快速排序的思想:可以定义两个指针i和j,i指向数组第一个元素,j指向数组最后一个元素,j从后向前扫描,i从前向后扫描,要求j始终指向偶数,i始终指向奇数,当j指向的是奇数,i指向的是偶数的时候,互换二者指向的数字。一直循环直到i>j为止。

            针对题目二,要求奇数和偶数的相对位置不变,也有两种比较直观的解法:

    (1)采用冒泡排序的思想,每一趟从最后一个元素开始,将它与前一个元素比较,如果前一个元素为偶数,后一个元素为奇数,则互换二者的位置,一共要循环n-1趟,时间复杂度为O(n2)。也可以采用直接插入排序的思想,很简单,在此不再赘述。

    (2)空间换时间,定义两个数组,分别存储array[]中的元素,然后将两个数组的元素赋值给array[]。


java实现

题目一(1)

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

题目一(2)

//quickSort思想
    public void reOrderArray(int [] array) {
        if(array == null)
            return;
        int i = 0;
        int j = array.length - 1;
        int tmp = 0;
        while(i<j){
            //注意此时只有i<j的时候才需要继续遍历所以这个条件在前面
            //因为当j指向偶数,i指向奇数的时候,两个指针需要不断的向前或向后扫描,而不是1次就结束了,所以此处必须用while,而不能用if!
            //还要注意数组元素与数组下标的区别。。。这种低级错误不能犯。。。是判断数组元素的奇偶性,而不是数组下标的!!
            while((i<j)&&(array[j] & 1)==0)
                j--;
            while((i<j)&&(array[i] &1) == 1)
                i++;
            if(i<j){
                tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
                //j--;
               // i++;
            }
        }
    }

题目二(1)

public void reOrderArray(int [] array) {   //bubbleSort思想
        int tmp = 0;
        for(int i = 0; i < array.length - 1; i++){
            for(int j = array.length-1; j>i;j--){
                //如果偶数在前奇数在后,则互换两个元素的位置
                if(((array[j-1]&0x1)==0)&&((array[j]&0x1)==1)){
                    tmp=array[j];
                    array[j]=array[j-1];
                    array[j-1]=tmp;
                }
            }
       }
    }
//直接插入排序思想
    public void reOrderArray(int [] a) {
        int n = a.length;
        for(int i=1;i<n;i++){
            int j = i-1;
            int tmp=a[i];
            while(j>=0&&((a[j]&0x1)==0)&&(tmp&0x1)==1){
                a[j+1]=a[j];
                j--;
            }
            a[j+1]=tmp;
        }
    }

题目二(2)

public void reOrderArray(int [] array) {
        int count= 0;//保存数组中奇数的个数
        for(int i =0;i<array.length;i++){
            if((array[i]&0x1)==1)
                count++;
        }
        int[] tmp1 = new int[count];//暂存数组,保存奇数
        int[] tmp2 = new int[array.length-count];//暂存数组,保存偶数
        int oddNum=0, evenNum=0;
        for(int i =0;i<array.length;i++){
            if((array[i]&0x1)==1)
                tmp1[oddNum++]=array[i];
            else
                tmp2[evenNum++]=array[i];
        }  
         
        for(int i = 0;i<tmp1.length;i++)
            array[i]=tmp1[i];
        for(int i=0,j=count; i<tmp2.length;i++,j++)
            array[j]=tmp2[i];
 
       
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值