使用最少的空间调整元素的位置

My_Love 2012-08-31 03:17:19
数组(n是奇数)
A0 A1 A2 A3 A4 A5 A6 A7...An

=>

A0 A2 A4 A6...A1 A3 A5 A7...An

有没有简单的算法?
...全文
166 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
happytengfei 2012-09-06
  • 打赏
  • 举报
回复
a和b交换
a = a+b
b = a - b;
a = a - b;

int compare(type a, type b)
{
if(a%2==0 && b%2==0 || a%2==1 && b%2==1)
return a >= b;
else if(a%2 ==0 && b%2 ==1)
return 1;
else
return 0;
}
  • 打赏
  • 举报
回复
这道题有O(n)的方法。不过“可能”需要O(n)的辅助空间。

因为只按照数组下标的规律,所以我们可以找到一个通用公式
Ai在新数组的位置是 (i&1) * (n/2+1) + i/2
next(i) = (i&1) * (n/2+1) + i/2

for p从0开始向后扫描至数组末尾,遇到处理过的元素跳过
{
q = p
tmp = Aq;
标记Aq为处理过。
do { swap( Anext(q), tmp ); 标记Anext(q)为处理过; q = next(q); } while( q != p );
}

标记处理需要额外的O(n)空间,但是,如果原来的元素都是正整数,那么可以将处理过的元素标记为相反数,等到最后都处理完了,再把所有数据改回正整数。
huangxy10 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
如果只考虑空间复杂度的话,可以不需要交换空间。

以交换A1,A2位置上的数为例:
记nA0,nA1,nA2 分别为数组A0,A1,A2中所存的数
初始值:
A0 = nA1; A1 = nA1; A2 = nA2;

第一步:
A1 = A1 - A2 = nA1 - nA2;
A2 = A2 - A0 = nA2 - nA0;
A0 = A0 + A1 = nA0 + nA……
[/Quote]

可以不用其他辅助空间就可以交换,包括A0,如下

#include <iostream>
using namespace std;
void main()
{
int a =5;
int b =3;
a ^= b;
b ^= a;
a ^= b;
cout <<a<<" " << b<<endl;
}
supersonic0410 2012-08-31
  • 打赏
  • 举报
回复

如果只考虑空间复杂度的话,可以不需要交换空间。

以交换A1,A2位置上的数为例:
记nA0,nA1,nA2 分别为数组A0,A1,A2中所存的数
初始值:
A0 = nA1; A1 = nA1; A2 = nA2;

第一步:
A1 = A1 - A2 = nA1 - nA2;
A2 = A2 - A0 = nA2 - nA0;
A0 = A0 + A1 = nA0 + nA1 - nA2;

第二步:
A2 = A2 + A0 = nA2 - nA0 + nA0 + nA1 - nA2 = nA1;
A1 = -A1 = nA2 - nA1;
A1 = A1 + A2 = nA2 - nA1 + nA1 = nA2;
A0 = A0 + A1 - A2 = nA0 + nA1 - nA2 + nA2 - nA1 = nA0;
WizardOz 2012-08-31
  • 打赏
  • 举报
回复
快速排序,O(nlgn)的时间复杂度,O(1)的空间。
绿色夹克衫 2012-08-31
  • 打赏
  • 举报
回复
又见到这个问题,有个n*log(n),O(1)的分治方法,O(n),O(1)的方法还没想到
  • 打赏
  • 举报
回复
一般的算法大多会导致多用一个临时空间,不用空间交换的算法大概只有一个了,位运算.自己写个函数,完成两个数数值的交换就可以了
施工中请绕行 2012-08-31
  • 打赏
  • 举报
回复
o(1)的空间,O(n^2)的时间行不?

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧