2012年UC的一道笔试题——空间时间复杂度限制下的数字排序

2012年UC的一道笔试题
在空间复杂度O(1),时间复杂度O(n)下,置换数组
a1, a2, ..., an, b1, b2, ..., bn
置换后

a1, b1, a2, b2,..., an, bn 


关于此题,一般我们的做法都是重新构造一个数组来进行操作,但与题中描述的空间复杂度O(1)不符,为了达到空间复杂度O(1),就必须充分利用原数组的空间,因而我使用的方法是迭代置换,具体代码如下:

#include <stdio.h>

#define N	10

int a[2	* N + 1];
int temp = 0, flag = 1;
void IterSwap(int index)
{
	int t = index;
	
	if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t]))
	{
		flag = 1;
		return;
	}
	
	// 第一次迭代,暂存变量
	if (flag)
	{
		temp = index;
		flag = 0;
	}
	
	if (index % 2)
	{
		t = (index + 1) / 2;
		if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t]))
		{
			a[index] = temp;
			flag = 1;
			return;
		}
	}
	else
	{
		t = index / 2 + N;
		if ((t % 2 && (t + 1) / 2 == a[t]) || (!(t % 2) && t / 2 + N == a[t]))
		{
			a[index] = temp;
			flag = 1;
			return;
		}
	}
	a[index] = a[t];
	IterSwap(t);
}
int main()
{
	int i;
	
	for (i=1; i<=2 * N; ++i)
		a[i] = i;
	
	i = 2 * N - 1;
	for (i = 2; i < 2 * N; ++i)
		IterSwap(i);
	
	for (i=1; i<=2 * N; ++i)
		printf("%d ", a[i]);
	printf("\n");

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值