调整数组顺序实现:奇数在偶数前面 以及 “奇偶奇偶”相间

问题:

问题一,需要重新排列数组,使得数组的奇数在前面,偶数在后面;

问题二,使得“奇偶奇偶”相间,时间复杂度为O(n)。空间复杂度是O(1)。

分析:

第一个问题,马上想到的就是用两个指针的方法,一个放在头,一个放在尾,同时往中间走,不符合条件,再交换头和尾。

第二个问题,没有什么好的思路,看到网友的思路,还比较认同的,但是时间复杂度有待商榷。

代码如下:

#include<iostream>
using namespace std;

bool isEven(int number)
{
	return number & 0x01 == 0x01 ? false : true;
}

/*
 * 实现奇数和偶数分开,奇数在前,偶数在后
 */

int ajust(int a[], int len)
{
	if (a == NULL || len <= 0)
		return -1;
	int start = 0;
	int end = len - 1;

	while (start <= end)
	{
		while (start <= end && isEven(a[end]))
			end--;
		while (start <= end && !isEven(a[start]))
			start++;
		if (start <= end)
		{
			int temp = a[end];
			a[end] = a[start];
			a[start] = temp;
			start++;
			end--;
		}
	}

	return 0;
}

/*
 * 实现奇数和偶数相间
 */
int odd_even(int a[], int len)
{
	int i = -1;
	int j = 0;
	bool changed = true;	//这个标志位非常重要,可以理解为,i和j之间相差不能超过1
	while (j < len)
	{
		if (isEven(j) == !isEven(a[j]))	//如果所在位置正确,不进行交换,直接判断i是否自增
		{
			if(changed)
				i++;
		}
		else
		{
			changed = false;
			if (!isEven(i + 1) == isEven(a[j]))
			{
				i++;
				int temp = a[i];
				a[i] = a[j];
				a[j] = temp;
				j = i;		//将j重新赋值,但是这会导致时间复杂度超过O(n)
				changed = true;
			}
		}
		j++;
	}

	return 0;
}

int main()
{
	int a[] =
	{ 6, 8, 10, 1, 3, 5 };
	ajust(a, sizeof(a) / sizeof(a[0]));

	for (int i = 0; i < (int) (sizeof(a) / sizeof(a[0])); i++)
		cout << a[i] << " ";
	cout << endl;

	odd_even(a, sizeof(a) / sizeof(a[0]));
	for (int i = 0; i < (int) (sizeof(a) / sizeof(a[0])); i++)
		cout << a[i] << " ";

	return 0;
}

总结:

如果修改问题,改成奇数和偶数的相对顺序不变,又该如何做呢?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值