题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
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 时