partition 2.不改变数组位置使得数组奇数位于偶数前

奇数放在偶数前且保证数之间的相对位置不变

类似于快排的partition问题,快排要分为小于大于,等于三个部分,所以需要两个变量less,more来分开,还有一个是cur。而这要分为奇数偶数,需要一个变量mid,还需要cur。
快排一直让less和more处于分界处。
而这个只有一个变量的时候可以先让mid走几步,走到偶数的地方,让它表示第一个开始的偶数,然后cur再等于它的下一个,开始循环。
如果此时是偶数就跳过,是奇数(此时要把这个数插入到mid之前的一个位置,把mid到这个数之间的数全都后移)则将cur此时值保存,mid到cur的偶数全部向后移动,将cur插入mid的地方,mid++,cur++;(因为这里要求是不能改变位置,所以不能直接把奇数交换到后面,而得所有值都向后移动)
这种操作就和快排一样,O(nlogn),因为每操作一个奇数都需要移动mid处到它位置处的所有值。
禁止表达式混用++

public class Solution {
    public void reOrderArray(int [] array) {
        int mid=0;//作为第一个偶数的分割点
        while(mid<array.length && (array[mid] & 1) ==1){
            mid++;
        }
        int cur=mid+1;//既然退出循环,说明这个值就是偶数,记得别用mid++,因为用了之后mid也会+1
        while(cur<array.length){
            if((array[cur] & 1) ==0){//如果是偶数,则不用操作
                cur++;
            }else{//如果是奇数,则需要将它向前移动到mid的位置,而mid位置到这个数的位置的值全部向后移动
                int num=array[cur];
                int index=cur-1;
                while(index+1<array.length && index>=mid){
                    array[index+1]=array[index];
                    index--;
                }
                array[mid]=num;
                cur++;
                mid++;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将整数数组a[0..n]分为两部分,使得左边所有元素为奇数,右边所有元素为偶数,可以采用双指针的方法。 首先,设定两个指针left和right,初始时left指向数组的起始位置,right指向数组的末尾位置。 然后,进行如下操作: 1. 当left指向的元素为偶数,right指向的元素为奇数时,交换两个元素的位置; 2. 当left指向的元素为奇数时,left向右移动一位; 3. 当right指向的元素为偶数时,right向左移动一位; 4. 重复操作1-3,直到left大于等于right为止。 最后,左边所有元素为奇数,右边所有元素为偶数,分界点即为left指针的位置。 下面是使用Python语言进行实现的示例代码: def partition_array(a): left = 0 right = len(a) - 1 while left < right: # 当left指向的元素为偶数,right指向的元素为奇数时,交换两个元素的位置 if a[left] % 2 == 0 and a[right] % 2 != 0: a[left], a[right] = a[right], a[left] # 当left指向的元素为奇数时,left向右移动一位 if a[left] % 2 != 0: left += 1 # 当right指向的元素为偶数时,right向左移动一位 if a[right] % 2 == 0: right -= 1 return left a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] partition_index = partition_array(a) print("分界点的索引为:", partition_index) print("左边所有元素为奇数:", a[:partition_index+1]) print("右边所有元素为偶数:", a[partition_index+1:]) 以上代码的输出结果为: 分界点的索引为: 4 左边所有元素为奇数: [1, 3, 5, 7, 9] 右边所有元素为偶数: [2, 4, 6, 8, 10]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值