您的位置:首页 > 其它

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

2012-10-18 10:01 162 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: