题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题解: 如果仅是将奇数排在偶数前面,我们直接用首尾两个指针判断。头指针向后移动,遇到偶数停下,尾指针向前移动,遇到奇数停下,再将两个指针所指向的元素进行交换。
但题目要求:奇数和奇数,偶数和偶数之间的相对位置不变。
所以我们的指针需要同向移动,j 指针始终在 i 指针之后。 (1)指针 i 向后移动,遇到偶数停下。 (2)指针 j 指向 i 的后一个,向后移动,遇到第一个奇数时停下。 (3)在当前 [ i , j ] 数组内进行元素的移动,保证其相对位置不变。
if(array.length == 1){ return; } int i = 0; while(i < array.length){ int j = i + 1; // 遍历数组,找到为偶数的元素 if(array[i] % 2 == 0) { // 在此偶数之后寻找第一个奇数 while (array[j] % 2 == 0) { // 遍历结束都为偶数,则排序结束 if (j == array.length - 1) { return; } j++; } // 找到之后,在数组内进行移动 int tmp = array[j]; for (int m = j; m > i; m--) { array[m] = array[m - 1]; } array[i] = tmp; } i++; }