所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
针对这个题目,我们可以维护两个指针,一个指针指向数组的第一个数字,向后移动;一个指针指向最后一个数字,向前移动。分四种情况:
1.如果后一个指针指向奇数而前一个指针指向偶数,则交换两个数;之后,前一个指针继续向后移动,后一个指针继续向前移动;
2.如果后一个指针指向奇数而前一个也指针指向奇数,则前一个指针继续向后移动,后一个指针位置不变;
3.如果后一个指针指向偶数而前一个指针也指向偶数,则前一个指针位置不变,后一个指针继续向前移动;
4.如果后一个指针指向偶数而前一个指针指向奇数,则前一个指针继续向后移动,后一个指针继续向前移动;
public class Test { public static void main(String[] args) { oddEvenSort(new int[]{1,2,3,4,5,6,6,6,66,7,8,9,10,11,1,1,1,1,1,14,15}); } public static void oddEvenSort(int[] arr) { int temp; for(int i = 0, j = arr.length-1; i < j;) { if(arr[j]%2 == 1) { if(arr[i]%2 == 0) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } else { i++; } } else { if(arr[i]%2 == 0) { j--; } else { i++; j--; } } } for(int i : arr) { System.out.print(i + ","); } } }