数组排序,使得所有奇数都在左边,所有偶数都在右边

题目描述

在一个N个整数数组里面,有多个奇数和偶数,设计一个排序算法,令所有的奇数都在左边。

请完成sort的代码实现

void sort(int[]a)
{
    
}
例如: 当输入a = {8,4,1,6,7,4,9,6,4},

a = {1,7,9,8,4,6,4,6,4}为一种满足条件的排序结果。

参考思路1:

(1)快慢指针同时从一侧出发,找到第一个偶数时,慢指针(pre)停下来,快指针(pos)寻找下一个奇数,找到就交换,

(2)然后快慢指针+1继续

时间复杂度为O(n)

public class MyClass {
    public static void main(String args[]) {
        int [] a = new int[]{8,4,1,6,7,4,9,6,4};
        for(int i = 0; i<a.length; i++)
        {
            System.out.print(a[i]);
        }
        System.out.println();
        sort(a);
    }
    public static void sort(int arr[])
    {
        int len = arr.length;
        int pre = 0;
        int pos = 0;
        boolean flag = true;
        for(; pos<len;pos++)
        {
            if(flag && arr[pos] % 2 == 0)
            {
                pre = pos;
                flag = false;//执行第(1)步
            }
            if(!flag && arr[pos] % 2 == 1)
            {
                int temp = arr[pos];
                arr[pos] = arr[pre];
                arr[pre] = temp;
                pre++;//执行第(2)步,pos++在for循环里面执行了
            }
        }
        // 查看整个数组奇偶交换成功与否
        for(int j = 0; j< arr.length; j++)
        {
            System.out.print(arr[j]);
        }
    }
}

输出结果:

841674964
179644864

参考思路2:

(1)设置begin, end两个指针,begin指向数组的偶数,end指向数组的奇数;

(2)交换偶数和奇数,同时begin++,end--;

public class MyClass {
    public static void main(String args[]) {
        int [] arr = new int[]{8,4,1,6,7,4,9,6,4};
        for(int i = 0; i<arr.length; i++)
        {
            System.out.print(arr[i]);
        }
        System.out.println();
        sort(arr);
    }
    public static void sort(int a[])
    {
        int begin = 0, end = a.length - 1;
        while(begin < end)
        {
            if(a[begin] % 2 == 0 && a[end] % 2 == 1)
            {
                int temp = a[begin];
                a[begin] = a[end];
                a[end] = temp;
            }
            else if(a[begin] % 2 == 1)
            {
                begin++;
            }
            else if(a[end] % 2 == 0)
            {
                end--;
            }
        }
        for(int jj = 0; jj< a.length; jj++)
        {
            System.out.print(a[jj]);
        }
    }
}

打印结果:

841674964
971644864

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值