题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有技术位于数组的前半部分,所有偶数位于数组的后半部分。
直接上代码:
private static void sortArray1(int[] array) {
int start = 0;
int end = array.length - 1;
while (start != end) {
if (array[start] % 2 == 0) {
for (int j = end; j >= 0; j--) {
if (array[j] % 2 == 1) {
int swap = array[start];
array[start] = array[j];
array[j] = swap;
break;
}
end--;
}
}
start++;
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
}
//int[] array = { 1, 2, 3, 4, 5, 6, 7 };
//结果1,7,3,5,4,6,2,
分析:
指定两个指针一个从头,一个从尾。头指针如果遇到奇数跳过,遇到偶数和尾指针(此时为奇数时)进行交换。
但是这样排序的结果不是很理想。因为 破坏了原有的排序;例如 定义一个array[] = {1,2,3,4,5,6,7};
排序后的结果为{1,7,3,5,4,6,2}; 在原数组中{2]位于{4}的前面,但是现在反而变成了后面;
我们要的顺序因该是{1,3,5,7,2,4,6,}
解决方案:我们可以采用栈的思想,先经过遍历将所有的奇数压入堆栈,再将所有的偶数压入堆栈。然后覆盖原数组;
private static void sortArray(int[] number) {
Stack<Integer> stack = new Stack<>();
for (int i = 0; i <= number.length - 1; i++) { //将奇数压入
if (number[i] % 2 == 1) {
stack.push(number[i]);
}
}
for (int j = 0; j <= number.length - 1; j++) {//将偶数压入
if (number[j] % 2 == 0) {
stack.push(number[j]);
}
}
for (int i = number.length - 1; i >= 0; i--) {
number[i] = stack.pop(); //替代所有原数组
}
for (int i = 0; i < number.length; i++) {
System.out.print(number[i] + ",");
}
}
结果如预期一样。