题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分
思路:
我认真看了一下,题目应该是要求在原地调整,所以这里不能再开辟一个数组
第一种:从头往尾扫描数组,遇到一个偶数就把它提出来,依次把其后的数字前移一格,最后将偶数插入末尾的空位。时间复杂度为
O(n2)
O
(
n
2
)
第二种:采用两指针分别从首尾出发,当头指针遇到一个偶数,并且尾指针遇到一个奇数时,交换两指针的数字,直到两指针相遇。时间复杂度为
O(n)
O
(
n
)
,(类似于快排)
实现代码:
def reOrderArray(self, array):
n = len(array)
head = 0
tail = n - 1
while head < tail:
while array[head]%2 != 0:
head += 1
while array[tail]%2 == 0:
tail -= 1
array[head], array[tail] = array[tail], array[head]
head += 1
tail -= 1
牛客网附加条件:
保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:
由于要求相对位置不变,所以以上两种方法不能使用了。我看了一下网络上对于附加条件的解决方案,没有太好的办法,一类是采用稳定的排序,例如冒泡,归并,二是开辟长度为n的数组,遍历原数组,依次把奇数偶数放入新数组,最后将新数组赋值给原数组。时间空间复杂度都没有优化,这里就不在实现了。