题目:在一个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
}
}
}