思路
空间换时间,队列。时间复杂度O(n),空间复杂度O(n)。
稳定原地排序,冒泡。时间复杂度O(n²),空间复杂度O(1)。
空间换时间代码
import java.util.*;
public class Solution {
public void reOrderArray(int [] array) {
Queue<Integer> queue1 = new LinkedList<Integer>();
Queue<Integer> queue2 = new LinkedList<Integer>();
for(int a : array) {
if(a%2 == 1){
queue1.offer(a);
} else {
queue2.offer(a);
}
}
for(int i = 0; i < array.length; i++) {
if(queue1.peek() != null) {
array[i] = queue1.poll();
} else {
array[i] = queue2.poll();
}
}
}
}
冒泡排序
import java.util.*;
public class Solution {
public void reOrderArray(int [] array) {
int oddcount = 0;
for(int a : array) {
if(a%2 == 1) {
oddcount++;
}
}
for(int i = 0; i < oddcount; i++) {
// 无交换则退出
boolean flag = true;
for(int j = array.length - 1; j > i; j--) {
if(array[j]%2 == 1 && array[j-1]%2 == 0){
int tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
flag = false;
}
}
if(flag){
break;
}
}
}
}
笔记
-
offer,add 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。 -
poll,remove 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。 -
peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。