奇偶数排序--整数数组的奇偶数分开(小米公司笔试题)

题目:在一个N个整数数组里,有多个奇数和偶数,设计一种排序算法,使得所有的奇数都在左边,偶数都在右边,code实现。

本题就是快速排序的变形题。就是把快排的partition划分区间过程的进行改变。采用双指针左右扫描法,根据题意,奇数在左,偶数在右,有low=0;high=arr.length-1;从high-- 方向扫描到第一个奇数要进行交换,否则high--;而从low++ 方向扫描到第一个偶数要进行交换,否则low++;时间复杂度O(N)。直接贴代码:

package com.favorites;
/**
 * 求一个整型数组中,把奇数调整在左边,偶数调整在右边
 * 例如: int[] arr = {1,2,3,4,5,6,7,8,9,0};
 * 调整后的结果:[1 ,9, 3, 7, 5 ,6 ,4, 8 ,2 ,0 ]
 * @author dengyu
 *
 */
public class OddEvenSort {
	
	//  奇数偶数排序  时间复杂度O(N)
	public static void oddEvenSort(int[] arr){
		int low = 0;
		int high = arr.length-1;
		while(low<high) {
			//high-- 方向  扫描第一个奇数要进行交换
			if(isOdd(arr[high])&&low<high){
				high --;
			//low++ 方向  扫描第一个偶数要进行交换
			}else if((isEven(arr[low]))&&low<high){
				low ++;
			}else {
				//执行交换操作
				swap(arr,low,high);
			}
		}
	}
	//偶数判断器  
	public static boolean isOdd(int n){
		if(n%2==0){
			return true;
		}
		return false;
	}
	//奇数判断器  
	public static boolean isEven(int n){
		if(n%2==1){
			return true;
		}
		return false;
	}
	
	public static void swap(int[] arr,int i,int j){
		arr[i] = arr[i] + arr[j];
		arr[j] = arr[i] - arr[j];
		arr[i] = arr[i] - arr[j];
	}
	
	public static void main(String[] args) {
		int[] arr = {8,4,1,6,7,4,9,6,4};
		oddEvenSort(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(+arr[i]+" ");//9 7 1 6 4 4 8 6 4
		}
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值