调整数组顺序使奇数位于偶数之前
来源:互联网 发布:windows xp如何小键盘 编辑:程序博客网 时间:2024/05/21 17:46
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
main函数
//// Created by Zhxc on 2017.//#include <iostream>#include <cstdlib>#include <vector>#include "TestHelper.h"using namespace std;//第一个思路:类似冒泡算法,前偶后奇数就交换,复杂度为O(n2)void reOrderArray1(vector<int> *array){for (int i = 0; i < (*array).size(); ++i){for (int j = 0; j < (*array).size() - 1; ++j){if ((*array)[j] % 2 == 0 && (*array)[j + 1] % 2 == 1){swap((*array)[j], (*array)[j + 1]);}}}}//第二个思路:再创建一个数组,复杂度为O(n)void reOrderArray2(vector<int> *array) {vector<int> vec1, vec2;for (auto i : (*array)){if (i % 2 == 1){vec1.push_back(i);}else{vec2.push_back(i);}}(*array).clear(); // 先清空for (auto i = 0; i < vec1.size(); ++i){(*array).push_back(vec1[i]);}for (auto i = 0; i < vec2.size(); ++i){(*array).push_back(vec2[i]);}}int main(){int n = 20;vector<int>* array1 = TestHelper::generateRandomArray(n, 0, 100);vector<int>* array2 = TestHelper::copyIntArray(array1);cout << "调整前:" << endl;TestHelper::printArray(array2);cout << endl;TestHelper::test("reOrderArray1", reOrderArray1, array1);TestHelper::test("reOrderArray2", reOrderArray2, array2);cout << "调整后:" << endl;TestHelper::printArray(array1);TestHelper::printArray(array2);delete[] array1;delete[] array2;cout << endl;system("pause");return 0;}
用于测试的
结果:
当n取值较小时二者所用时间无较大差异;
TestHelper.h
//// Created by Zhxc on 2017.//#ifndef INCTESTHELPER_H#define INCTESTHELPER_H#include <iostream>#include <algorithm>#include <string>#include <ctime>#include <cassert>#include <vector>using namespace std;namespace TestHelper{// 生成有n个元素的随机数组,每个元素的随机范围为[rangeL, rangeR]vector<int>* generateRandomArray(int n, int range_l, int range_r){vector<int>* vec;vec = new vector<int>[n];//cout << vec.size() << endl; //srand(time(NULL));for (int i = 0; i < n; ++i){(*vec).push_back(rand() % (range_r - range_l + 1) + range_l);}return vec;}// 拷贝整型数组a中的所有元素到一个新的数组, 并返回新的数组vector<int>* copyIntArray(vector<int>* vec){vector<int>* newvec = new vector<int>[(*vec).size()];for (auto i : *vec){(*newvec).push_back(i);}return newvec;}void printArray(vector<int>* vec){for (auto i : *vec){cout << i << " ";}cout << endl;}// 测试算法排所得到结果运行时间void test(const string& fcn_name, void(*array)(vector<int>* vec), vector<int>* vec){clock_t startTime = clock();array(vec);clock_t endTime = clock();cout << fcn_name << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " s" << endl;}};
另外须加注意的是vector不能用下标的形式添加元素,如:
for (decltype(vec.size() i = 0; i != 10; ++i){vec[i] = i; // 严重错误: vec不包含任何元素!!}
当n取值较小时二者所用时间无较大差异;
但n值很大的是所用时间差异非常大。
n = 100 时
n = 1000 时
n = 10000 时
阅读全文
0 0
- 【笔试】32、调整数组顺序使奇数位于偶数之前
- 调整数组顺序使奇数位于偶数之前
- 调整数组顺序使奇数位于偶数之前
- 调整数组顺序使奇数位于偶数之前
- 剑指Offer-题14:调整数组顺序使奇数位于偶数之前
- 剑指Offer-14-调整数组顺序使奇数位于偶数之前
- 【剑指 offer】(十四)—— 调整数组顺序使奇数位于偶数之前
- 微软面试100题系列---调整数组顺序,使奇数位于偶数之前
- 剑指offer——调整数组顺序使奇数位于偶数之前
- 剑指offer 之 调整数组顺序使奇数位于偶数之前
- (12)调整数组,使奇数位于偶数之前;
- 【数组3】-调整数组顺序使奇数位于偶数前面
- 数组3:调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面--总结
- 调整数组顺序使奇数位于偶数前面
- 调整数组顺序使奇数位于偶数前面
- 通俗说说DSP、SSP、RTB、DMP是什么
- SQL Server 常用代码块
- 收藏的一些不错的多线程编程的文章
- 模块化
- Docker(镜像层缓存,Dockerfile调试)
- 调整数组顺序使奇数位于偶数之前
- atoi() 函数与 itoa() 函数:字符串与数值之间的转换
- linux学习第三十八篇: Apache和PHP结合,Apache默认虚拟主机
- Maven 简介
- Maven学习总结系列八:使用Nexus创建私服
- 一切从此开始
- Spring是什么
- 熵扰动和绝热扰动
- cxf框架的简介