题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:
其实该题目是一道排序题,由于题目要求相对位置不变,因此我们需要使用稳定的排序算法,插入排序或者冒泡排序
插入排序,就是每次扫描到奇数时,就把它插入到上一个奇数的后面,因此,需要将这一节的偶数整体向后移动,时间复杂度为O(n^2)
冒泡排序即每次遇到偶数在前奇数在后的情况,就交换两者的位置,时间复杂度也为O(n^2)
也可以牺牲空间换取时间,定义一个数组,如果遇到奇数原数组不变,如果遇到偶数,将该数插入到新数组中,然后从原数组移除该元素,最后将新数组拼接在原数组后面
如果改题目不要求相对位置,那么我们就可以使用快排的思想来做
C++实现插入排序思想:
class Solution { public: void reOrderArray(vector<int> &array) { int odd = -1;//奇数指针 int temp; for(int i=0;i<array.size();i++){ if(array[i] % 2 == 1){ temp = array[i]; for(int j=i;j> odd+1;j--){ array[j] = array[j-1]; } array[++odd] = temp; } } } };
java实现冒泡排序算法;
public class Solution { public void reOrderArray(int [] array) { boolean swap = true; int tmp; int len = array.length; for(int i = 0;i<len;i++){ if(swap == false) break; swap = false; for(int j = 0;j<len-i-1;j++){ if(array[j]%2==0 && array[j+1]%2==1){ tmp = array[j]; array[j] = array[j+1]; array[j+1] = tmp; swap = true; } } } } }
评论区大神使用c++ STL库的stable_partition函数
class Solution { public: bool static isOdd(int n){ return n%2==1; } void reOrderArray(vector<int> &array) { stable_partition(array.begin(),array.end(),isOdd); } };
stable_partition函数介绍:
双指针法:
class Solution { public: vector<int> exchange(vector<int>& nums) { int n = nums.size(); int left = 0,right = n-1; while(left<right){ while(left<right&&nums[left]&1)//奇数 left++; while(left<right&&!(nums[right]&1))//偶数 right--; swap(nums[left++],nums[right--]); } return nums; } };