1.题目

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。

2.思路

  本题有两种解法,一种是不保证数组稳定性的解法,一种是保证数组稳定性的解法。数组的稳定性是指数组的奇数和奇数,偶数和偶数之间的相对位置不变。

  • 不要求稳定性的解法:

两个指针,p指向第一个元素,q指向最后一个元素。两个指针遍历数组,向后移动p使得p指向偶数,向前移动q使得q指向奇数,交换p和q的内容。指针p位于指针q后面时,结束遍历。举例:12345->15342。

  • 要求稳定性的解法:

借鉴冒泡排序思想,每次确定一个位置。

3.code

#include <iostream>
#include <vector>
using namespace std; // 稳定的解法
class Solution_stable{
public:
void ReArray(vector<int > &array)
{
// 特殊输入
if(array.size() == 0 || array.size() == 1)
return; // 冒泡排序
for(int i = 0;i < array.size();++i)
for(int j = array.size()-1;j>i;--j)
if(array[j]%2 == 1 && array[j-1]%2 ==0)
swap(array[j],array[j-1]);
}
}; // 不稳定的解法
class Solution_no_stable{
public:
void ReArray(int *array2,int length)
{
// 特殊输入
if(array2 == nullptr || length == 0)
return; // 指针遍历数组
int *pLeft = array2;
int *pRight = array2 + length-1; while(pLeft<pRight)
{
// 向后移动pLeft,直到指向偶数
while(pLeft<pRight && *pLeft %2 == 1)
pLeft++; // 向前移动pRight,直到指向奇数
while(pLeft<pRight && *pRight %2 == 0)
pRight--; // 奇偶数交换
if(pLeft < pRight)
swap(*pLeft,*pRight);
}
}
};
int main()
{
// 稳定的解法
cout<<"稳定的解法"<<endl;
Solution_stable solution1;
vector<int> array = {1,2,3,4,5,6,7,8,9,10};
solution1.ReArray(array); for(int i = 0;i<array.size();++i)
cout<<array[i]<<endl; // 不稳定的解法
cout<<"不稳定的解法"<<endl;
Solution_no_stable solution2;
int length = 10;
int array2[10] = {1,2,3,4,5,6,7,8,9,10};
solution2.ReArray(array2,length); for(int i = 0;i<length;i++)
cout<<array2[i]<<endl;
return 0;
} 

4.复杂度

  时间复杂度为O(n2)

5.测试用例

  • 特殊输入:空数组、含一个元素的数组
  • 功能测试:奇偶交替、全部偶数在全部奇数之前、全部奇数在全部偶数之前

【剑指offer-21】调整数组顺序使奇数位于偶数前面,C++实现(冒泡排序)的更多相关文章

  1. 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...

  2. 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...

  3. 剑指Offer:调整数组顺序使奇数位于偶数前面【21】

    剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...

  4. 剑指offer:调整数组顺序使奇数位于偶数前面

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

  5. 【剑指Offer】调整数组顺序使奇数位于偶数前面 解题报告(Python)

    [牛客网]调整数组顺序使奇数位于偶数前面 解题报告 标签(空格分隔): 牛客网 题目地址:https://www.nowcoder.com/questionTerminal/beb5aa231adc4 ...

  6. 剑指offer(07)-调整数组顺序使奇数位于偶数前面【转】

    来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得 ...

  7. Go语言实现:【剑指offer】调整数组顺序使奇数位于偶数前面

    该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和 ...

  8. 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

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

  9. 剑指Offer 13. 调整数组顺序使奇数位于偶数前面 (数组)

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

  10. 【剑指offer】调整数组顺序使奇数位于偶数前面

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

随机推荐

  1. centos 查询mysql配置文件位置

    具体指令: 1.which mysqld  (”which 文件名“ : 搜索命令所在路径及别名) 2./usr/sbin/mysqld --verbose --help | grep -A 1 'D ...

  2. 算法学习 - ST表 - 稀疏表 - 解决RMQ问题

    2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...

  3. Select级联菜单,用Ajax获取Json绑定下拉框(jQuery)

    需求类似这样  ↓ ↓ ↓   -->    菜单A发生变化,动态取数据填充下拉菜单B. JS代码如下: <script type="text/javascript"& ...

  4. TCGA学习1--下载level3 level4数据

    1.使用firehose_get   下载level3 level4数据 https://confluence.broadinstitute.org/display/GDAC/Download exa ...

  5. Elasticsearch 使用技巧笔记

    1.重新分片 当出现Unassigned分片时,我们可以通过分片重分配解决这个问题 curl -X PUT http://192.168.0.37:9200/_cluster/settings \ - ...

  6. 'webpack' 不是内部或外部命令解决办法以及npm配置

    昨天在笔记本上安装webpack,按照教程下来,使用webpack命令行,报错:'webpack' 不是内部或外部命令,也不是可运行的程序 或批处理文件.网上有大量的配置方法与解决办法,找了好久才成功 ...

  7. Android显示框架:自定义View实践之绘制篇

    文章目录 一 View 二 Paint 2.1 颜色处理 2.2 文字处理 2.3 特殊处理 三 Canvas 3.1 界面绘制 3.2 范围裁切 3.3 集合变换 四 Path 4.1 添加图形 4 ...

  8. 【Linux】使用awk批量杀进程

    pkill 杀一个用户的所有进程 pkill -u bingo 批量杀进程 使用ps -ef|grep aaa 查出相关进程 使用grep -v grep 过滤掉grep本身产生的进程 使用awk 打 ...

  9. POJ1247-Magnificent Meatballs

    http://poj.org/problem?id=1247 Magnificent Meatballs Time Limit: 1000MS   Memory Limit: 10000K Total ...

  10. torch 深度学习(5)

    torch 深度学习(5) mnist torch siamese deep-learning 这篇文章主要是想使用torch学习并理解如何构建siamese network. siamese net ...