调整数组顺序使奇数位于偶数前面(保持原有元素的相对顺序)

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

解法1:使用两个队列,分别保存原数组的奇数元素和偶数元素,然后合并到原数组中。

void reOrderArray(vector &array) {

	if (array.size() == 0)
		return;

	queue odd_nums;
	queue even_nums;
	for (int i = 0; i < array.size(); ++i)
	{
		if (array[i] & 0x01 != 0)
			odd_nums.push(array[i]);
		else
			even_nums.push(array[i]);
	}

	int index = 0;
	int tmp = 0;
	while (!odd_nums.empty())
	{
		tmp = odd_nums.front();
		odd_nums.pop();
		array[index++] = tmp;
	}

	while (!even_nums.empty())
	{
		tmp = even_nums.front();
		even_nums.pop();
		array[index++] = tmp;
	}
}

解法2:从i开始从左到右遍历数组,如果i元素为偶数,则令j=i+1,向后扫描,直到j元素为找到的第一个奇数,将i到j-1之间的所有元素后移一格,然后将j元素放到i处,i指向下一个元素,终止条件为,j向后查找奇数失败。

void reOrderArray(vector &array) {

	if (array.size() == 0)
		return;

	for (int i = 0; i < array.size(); ++i)
	{

		if (array[i] % 2 == 0)
		{
			int j = i + 1;
			while (j < array.size() && array[j] % 2 == 0)
			{
				++j;
			}
			if (j == array.size())
			{
				break;
			}
			else
			{ 
				int odd_num = array[j];
				while (j > i)
				{
					array[j] = array[j - 1];
					--j;
				}
				array[i] = odd_num;
			}
		}
	}
}

 

你可能感兴趣的:(剑指offer典型题)