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

来源:互联网 发布: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;}

用于测试的
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
原创粉丝点击