调整数组顺序使得奇数位于偶数前面。不限排列顺序,只要求奇数在偶数前面。
package 剑指Offer;
import java.util.LinkedList;
/**
* @program:多线程和IO
* @descripton:调整数组顺序使得奇数位于偶数前面
* @author:ZhengCheng
* @create:2021/10/11-14:05
**/
public class ChangePositon {
//思路1:最简单的思路当然是遍历一次数组,将奇数保存在一个数组中,将偶数保存在一个数组中。然后复制。
//但是这样的方法需要占用On的空间,同时时间复杂度是On
private int[] sortA(int[] arr){
LinkedList<Integer> tempa = new LinkedList<>();
LinkedList<Integer> tempb = new LinkedList<>();
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 ==1){
tempa.add(arr[i]);
}else {
tempb.add(arr[i]);
}
}
for (int i = 0; i < arr.length; i++) {
if (tempa.size() != 0){
arr[i] = tempa.remove();
}else {
arr[i] = tempb.remove();
}
}
return arr;
}
//思路2:既然思路1中的方法占用了空间,那么我们是否可以想到使用原地交换的方式。
//使用双指针。
private int[] sortB(int[] arr){
int i = 0;
int j = arr.length-1;
//退出条件? i==j or i > j
while (i < j){
while (arr[i] % 2 !=0){
i++;
}
while (arr[j] % 2 == 0){
j--;
}
if (i == j || i >j){
break;
}
swap(arr , i , j);
}
return arr;
}
private void swap(int[] arr ,int i ,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {1,2,4,5,6,3};
// new ChangePositon().sortA(arr);
new ChangePositon().sortB(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}