题目描述:给定一个整数数组,请调整数组的顺序,使得所有奇数位于数组前半部分,所有偶数位于数组后半部分,
要求时间复杂度为O(n).
分析与解法:
最容易想到的办法是从头到尾扫描这个数组,每遇到一个偶数,就把他单独取出来,然后把该偶数后面的所有数往前移动一位,最后把该偶数放入数组的最末尾。因为每遇到一个偶数,需要移动O(N)个数,所以时间复杂故为O(N*N),不符合题目要求。
事实上,若把奇数看成是小数,偶数看成大数,那么按照题目要求的奇数放在偶数前面,就相当于小数放在大数的前面,有点像快排,就是通过一个主元把整个数组分成大小两个部分,小于主元的小数放在前面,大于主元的放在后面,划分过程有以下两种:
(1)一头一尾两个指针同时往中间扫,如果头指针遇到的数比主元大且尾指针遇到的数比主元小,交换头指针与尾指针
所指的数。
(2)一前一后两个指针同时从左往右扫,如果前指针遇到的数比主元小,则后指针右移一位,然后交换各自指向的数。与这个划分类似,奇偶排序也可以借鉴这两种方法。
解法一:一头一尾指针往中间扫
借鉴划分过程的第一种实现,可以考虑维护两个指针,一个指针指向数组的第一个数,称为头指针,向右移动,另一个指针指向最后一个数,称之为尾指针,向左移动。
这样,两个指针分别从数组的头部和尾部向数组的中间移动,如果第一个指针指向的数是偶数而第二个数指向的书是奇数,就交换这两个数字。因为按照题目要求,最终是为了让奇数排在