调整数组顺序使奇数位于偶数前面

来源:互联网 发布:sql server身份验证sa 编辑:程序博客网 时间:2024/06/05 00:14

<span style="font-family: arial, STHeiti, 'Microsoft YaHei', 宋体; background-color: rgb(255, 255, 255);">题目描述</span>

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

注意:本题需要保持奇数与奇数之间,偶数和偶数之间的相对位置不改变,所以就不能使用快排的partition,因为快排是不稳定的,这里提供几种方法。

法1:类似于冒泡排序,如果前面是偶数,后面是奇数,则交换两者的位置。

代码如下:

class Solution {public:void reOrderArray(vector<int> &array) {for (int P = array.size() - 1; P > 0; --P){bool flag = false; //默认无交换for (int i = 0; i < P; ++i){if (((array[i] & 1) == 0) && ((array[i + 1] & 1) != 0)){swap(array[i], array[i + 1]);flag = true;}}if (flag == false)break;}}};

法2:类似于插入排序,如果当前的数字是奇数,则将其前面的数字全部往后挪一个空位出来,将该数字插入。

代码如下:

class Solution {public:void reOrderArray(vector<int> &array) {for (int P = 1; P < array.size(); ++P){int Tmp = array[P];if ((array[P] & 1) == 0) //如果是偶数,继续下一个数字continue;else{int i;for (i = P; i > 0 && (array[i - 1] & 1) == 0; --i){array[i] = array[i - 1];}array[i] = Tmp;}}}};

上述两种方法的时间复杂度都是O(n^2);

法3:类似于归并排序,时间复杂度可降低到O(nlogn)

代码如下:

class Solution {public:void reOrderArray(vector<int> &array) {vector<int> temp(array.size());helpReorder(array, temp, 0, array.size() - 1);}public:void helpReorder(vector<int> &array, vector<int> &TmpArr, int L, int RightEnd){if (L < RightEnd){int center = (L + RightEnd) / 2;helpReorder(array, TmpArr, L, center);helpReorder(array, TmpArr, center+1, RightEnd);Merge(array, TmpArr, L, center + 1, RightEnd);}}void Merge(vector<int> &array, vector<int> &TmpArr, int L, int R, int RightEnd){int leftEnd = R - 1;int Tmp = L;int NumberofElem = RightEnd - L + 1;while (L <= leftEnd && (array[L] & 1) != 0){TmpArr[Tmp++] = array[L++];}while (R <= RightEnd && (array[R] & 1) != 0){TmpArr[Tmp++] = array[R++];}while (L <= leftEnd && (array[L] & 1) == 0){TmpArr[Tmp++] = array[L++];}while (R <= RightEnd && (array[R] & 1) == 0){TmpArr[Tmp++] = array[R++];}for (int i = 0; i < NumberofElem; ++i,RightEnd--){array[RightEnd] = TmpArr[RightEnd];}}};





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 中班安全教案脚扭伤了怎么办 中班脚扭伤了怎么办教案 中班安全脚扭伤了怎么办 中班安全脚扭伤了怎么办反思 走丢了怎么办教案反思 汽车后轱辘不转怎么办 走丢了怎么办社会教案 小老鼠搬鸡蛋鸡蛋太大怎么办 小班走丢了怎么办教案 小班走丢了怎么办反思 房屋外墙漏水物业不管怎么办 厨房墙砖用色花怎么办 小孩子做错事很偏激怎么办 孩子在学校偷钱怎么办 房间墙壁上到处有湿虫怎么办 买了西晒的房子怎么办 墙面瓷砖下水管漏水怎么办 西晒房间开空调没效果怎么办 墙纸被小孩画了怎么办 集成墙板缝隙大怎么办 高血压变低血压怎么办会恢复吗 总是感觉睡不够好困怎么办 两岁宝宝说有鬼怎么办 阳台改成了卧室晒衣服怎么办 室外墙角边墙泥受潮脱落怎么办 新房装修墙体发霉了怎么办 宝宝吃多了发烧怎么办 宝宝睡觉不爱盖被子怎么办 1岁宝宝不盖被子怎么办 2岁宝宝不盖被子怎么办 买的芬琳漆不够刷的怎么办 1.3米宽厨房门怎么办 墙面漆颜色刷深了怎么办 地板上沾了墙漆怎么办 孩子连发高烧8天了怎么办 孩子对数字不敏感怎么办 三岁宝宝不爱学习怎么办 5岁还不认识数字怎么办 小孩上中班还不认识数字怎么办 中班小孩数字都不认识怎么办 中班小孩记不住数字怎么办