NO15:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
思考:定义两个指针,分别指向数组的头(start)和尾(end)。如果头指针指向的是奇数,则后移一位,尾指针指向的是偶数,则前移一位。当头指针指向的是偶数且尾指针指向的是奇数的时候,头尾指向的值互换。循环条件:start < end
特殊情况:
1. 数组的长度 < 2,抛出异常。
2. 指针移动之后头指针可能与尾指针重叠或者在尾指针后面
/**
* 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
* 使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
*/
public class NO15 {
public static void main(String[] args) {
int[] arr = {1,2};
NO15A no15A = new NO15A();
no15A.printArray(arr);
System.out.println();
no15A.reOrderOddAndEven(arr);
no15A.printArray(arr);
}
}
class NO15A{
//排序函数
public void reOrderOddAndEven(int[] arr){
int arrLength = arr.length;
//如果数组的长度 < 2
if (arrLength < 2){
throw new RuntimeException("数组长度最少为2!");
}
int start = 0;
int end = arrLength - 1;
while (start < end){
while (arr[start] % 2 != 0){
start++;
}
while (arr[end] % 2 == 0){
end--;
}
/*移动之后的头尾指针有可能重叠或者头指针超过尾指针,此时直接退出循环,不可以进行值的交换*/
if (start >= end){
break;
}
if (arr[start] % 2 == 0 && arr[end] % 2 != 0){
int temp = arr[end];
arr[end] = arr[start];
arr[start] = temp;
}
}
}
//数组打印函数
public void printArray(int[] arr){
for(int a : arr){
System.out.print(a + " ");
}
}
}
运行结果:
1 2 3 4 5 6 7 8
1 7 3 4 5 6 2 8
Process finished with exit code 0