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

题目描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值