调整数组顺序使奇数位于偶数前面
来源:互联网 发布: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
- 【数组3】-调整数组顺序使奇数位于偶数前面
- 数组3:调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面--总结
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面[
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使偶数位于奇数前面
- coding - 调整数组顺序使奇数位于偶数前面
- 11.3 顺序容器类
- Android中实现全屏、无标题栏,中途去掉标题
- 多线程编程(2):解析异步消息处理机制
- C#多线程学习(四) 多线程的自动管理(线程池)
- sorl安装 部署
- 调整数组顺序使奇数位于偶数前面
- 11.4 泛型算法与函数对象
- 欢迎使用CSDN-markdown编辑器
- 11.5 关联容器类
- 11.6 容器适配器
- 网络负载均衡配置说明
- Eclipse中修改SVN用户名和密码方法
- 用librtmp 接收数据
- hydra dvwa brute force password