奇偶换位问题

medie2005 2007-12-03 08:07:42
加精
这个题是在C++版看到的,mathe作了解答,不过很有意思,发上来大家讨论讨论。

问题:一长度为2n的int的数组A[],其元素分布为:
A[0], A[1], ..., A[2n-1]
试用O(n)的时间、O(1)的空间将它变为:
A[0], A[2], ..., A[2n-2], A[1], A[3], ..., A[2n-1]
...全文
3769 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
r444444 2008-12-30
  • 打赏
  • 举报
回复
很难,很复杂
BusyCai 2008-10-15
  • 打赏
  • 举报
回复
mark
三翔馆主 2008-10-02
  • 打赏
  • 举报
回复
mark
wzyzb 2008-09-14
  • 打赏
  • 举报
回复
mark
jessekyypig 2008-09-13
  • 打赏
  • 举报
回复
C++/C code 简单测试了一下

class Queue
{
public:
int front;
int rear;
char data[5];
public:
Queue(){front=rear=0;}
void Enqueue(char ch)
{
data[rear++]=ch;
if(rear==5)rear=0;
}

char Dequeue()
{
char ch=data[front++];
if(front==5) front=0;
return ch;
}
};

int main()
{

Queue q;
char X[]="abcdefgh";//测试数据
int n=strlen(X)/2;int flag=1;int j=0,i;
for(i=1;i<2*n-1;i++)
{
if(flag==1)
{
if(i<=n-1)q.Enqueue(X[i]);
X[i]=X[n+j];
j++;
flag=0;
}
else
{
if(i<=n-1)q.Enqueue(X[i]);
X[i]=q.Dequeue();
flag=1;

}
}
cout<<X;
return 0;
}
rczjp 2008-07-25
  • 打赏
  • 举报
回复
你们有点猛...
kdliang031220 2008-07-24
  • 打赏
  • 举报
回复
zambertcdsn 2008-07-18
  • 打赏
  • 举报
回复
test&mark
yhlevin 2008-07-12
  • 打赏
  • 举报
回复
mark
Gob00st 2008-07-02
  • 打赏
  • 举报
回复
mark
wzyzb 2008-06-20
  • 打赏
  • 举报
回复
学习 了 你们都很强
cqqqq 2008-06-16
  • 打赏
  • 举报
回复



A[0] A[1] A[2] A[3] A[4] A[5] ... A[2n-4] A[2n-3] A[2n-2] A[2n-1]

交换元素A[1] A[2] ;A[2n-3] A[2n-2] 后


A[0] A[2] A[4] ... A[2n-4] A[2n-2] | A[1] A[3] A[5] ... A[2n-3] A[2n-1]

0 1 2 3 | 4 5 6 7 2n-1=7 n=4
hjb719 2008-04-30
  • 打赏
  • 举报
回复
mark
l007i 2008-04-09
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "stdlib.h"
#include "time.h"

int location( int k,int m)
{
if ( k>=m ) return 2*(k%m)+1;
return 2*(k%m);
}

int main(int argc,char *argv[])
{
int temp,index=1,free=1,i=1,max=2,M=9,newL;
int arr[2*9] = {11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29};
temp = arr[1];

while(i++<=2*M-2)
{
if( index<M && index == max ) max = index+1;

newL = location(index,M) ;

if( ( location(newL,M) == free ) )
{
arr[free] = arr[newL];
arr[newL] = temp;

index = max;
temp = arr[index];
free = index;
i++;

}
else
{
arr[free] = arr[newL];
arr[newL] = temp;
temp = arr[free];
index = newL;
}
}

for(int i=0;i<2*M;i++)
printf("%5d",arr[i]);

system("pause");

}
l007i 2008-04-09
  • 打赏
  • 举报
回复
int location( int k,int m)
{
if ( k>=m ) return 2*(k%m)+1;
return 2*(k%m);
}

int main(int argc,char *argv[])
{
int temp,index=1,free=1,i=1,max=2,M=4,newL;
int arr[2*4] = {11,12,13,14,21,22,23,24};
temp = arr[1];

while(i++<=2*M-2)
{
if( index<M && index == max ) max = index+1;

newL = location(index,M) ;

if( ( location(newL,M) == free ) )
{
arr[free] = arr[newL];
arr[newL] = temp;

index = max;
temp = arr[index];
free = index;
i++;

}
else
{
arr[free] = arr[newL];
arr[newL] = temp;
temp = arr[free];
index = newL;
}
}

for(int i=0;i<2*M;i++)
printf("%5d",arr[i]);

system("pause");

}
yaos 2008-02-08
  • 打赏
  • 举报
回复
int a[2n];
int i = 1;
int p;
int temp = a[0];
a[0] = a[1];
while (true)
{
if (i % 2)
p = (i + 2n - 1) / 2
else
p = i / 2;
a[i] = a[p];
a[p] = a[0];
a[0] = a[i];
i = p;
if (p = 1) break;
}
a[0] = temp;
上面的存在问题
修改下
yaos 2008-02-08
  • 打赏
  • 举报
回复
假设2n个
比如10
0 1 2 3 4 | 5 6 7 8 9

0 2 4 6 8 | 1 3 5 7 9

1 -> 5
5 -> 7
7 -> 8
8 -> 5
4 -> 2
2 -> 1

假设当前位置为x x从零开始 总共2n个位置
则移动到位置p
if even(x) p = x / 2
if odd(x) p = (x + 2n - 1) / 2

int a[2n];
int i = 1;
int p;
int temp = a[0];
a[0] = a[1];
while (i <> 1)
{
if (i % 2)
p = (i + 2n - 1) / 2
else
p = i / 2;
a[i] = a[p];
a[p] = a[0];
a[0] = a[i];
i = p;
}
a[1] = a[0];
a[0] = temp;

不知道这个能正确移动么?



jmulxg 2008-01-28
  • 打赏
  • 举报
回复
MARK
rodney1983 2008-01-16
  • 打赏
  • 举报
回复
mark
shdongsichyang 2008-01-09
  • 打赏
  • 举报
回复
markvv
加载更多回复(36)
本书是《组合数学》第3版的修订版,全书共分8章,分别是:排列与组合、递推关系与母函数、容斥原理与鸽巢原理、burnside引理与polya定理、区组设计、线性规划、编码简介、组合算法简介。丰富的实例及理论和实际相结合是本书一大特点,有利于对问题的深入理解。. 本书是计算机系本科生和研究生的教学用书,也可作为数学专业师生的教学参考书。 目录回到顶部↑ 第1章 排列与组合. 1.1 加法法则与乘法法则 1.2 一一对应 1.3 排列与组合 1.3.1 排列与组合的模型 1.3.2 排列与组合问题的举伊 1.4 圆周排列 1.5 排列的生成算法 1.5.1 序数法 1.5.2 字典序法 1.5.3 换位法 1.6 允许重复的组合与不相邻的组合 1.6.1 允许重复的组合 1.6.2 不相邻的组合 1.6.3 线性方程的整数解的个数问题 1.6.4 组合的生成 1.7 组合意义的解释 1.8 应用举例 1.9 stirling公式 1.9.1 wallis公式 .1.9.2 stirling公式的证明 习题 第2章 递推关系与母函数 2.1 递推关系 2.2 母函数 2.3 fibonacci序列 2.3.1 fibonacci序列的递推关系 2.3.2 若干等式 2.4 优选法与fibonacci序列的应用 2.4.1 优选法 2.4.2 优选法的步骤 2.4.3 fibonacci的应用 2.5 母函数的性质 2.6 线性常系数齐次递推关系 2.7 关于线性常系数非齐次递推关系 2.8 整数的拆分 2.9 ferrers图像 2.10 拆分数估计 2.11 指数型母函数 2.11.1 问题的提出 2.11.2 指数型母函数的定义 2.12 广义二项式定理 2.13 应用举例 2.14 非线性递推关系举例 2.14.1 stirling数 2.14.2 catalan数 2.14.3 举例 2.15 递推关系解法的补充 习题 第3章 容斥原理与鸽巢原理 3.1 demorgan定理 3.2 容斥定理 3.3 容斥原理举例 3.4 棋盘多项式与有限制条件的排列 3.5 有禁区的排列 3.6 广义的容斥原理 3.6.1 容斥原理的推广 3.6.2 一般公式 3.7 广义容斥原理的应用 3.8 第二类stirling数的展开式 3.9 欧拉函数φ(n) 3.10 n对夫妻问题 3.11 mobius反演定理 3.12 鸽巢原理 3.13 鸽巢原理举例 3.14 鸽巢原理的推广 3.14.1 推广形式之一 3.14.2 应用举例 3.14.3 推广形式之二 3.15 ramsey数 3.15.1 ramsey问题 3.15.2 ramsey数 习题 第4章 burnside引理与polya定理 4.1 群的概念 4.1.1 定义 4.1.2 群的基本性质 4.2 置换群 4.3 循环、奇循环与偶循环 4.4 burnside引理 4.4.1 若干概念 4.4.2 重要定理 4.4.3 举例说明.. 4.5 polya定理 4.6 举例 4.7 母函数形式的polya定理 4.8 图的计数 4.9 polya定理的若干推广 习题 第5章 区组设计 5.1 问题的提出 5.2 拉丁方与正交的拉丁方 5.2.1 问题的引入 5.2.2 正交拉丁方及其性质 5.3 域的概念 5.4 galois域gf(pm) 5.5 正交拉丁方的构造 5.6 正交拉丁方的应用举例 5.7 均衡不完全的区组设计 5.7.1 基本概念 5.7.2 (b,u,r,k,λ)-设计 5.8 区组设计的构成方法 5.9 steiner三元素 5.10 kirkman女生问题 习题 第6章 线性规划 6.1 问题的提出 6.2 线性规划的问题 6.3 凸集 6.4 线性规划的几何意义 6.5 单纯形法的理论基础 6.5.1 松弛变量 6.5.2 解的充要条件 6.6 单纯形法与单纯形表格 6.7 改善的单纯形法 6.8 对偶概念 6.9 对偶单纯形法 习题 第7章 编码简介 7.1 基本概念 7.2 对称二元信道 7.3 纠错码 7.3.1 最近邻法则 7.3.2 hamming不等式 7.4 若干简单的编码 7.4.1 重复码 7.4.2 奇偶校验码 7.5 线性码 7.5.1 生成矩阵与校验矩阵 7.5.2 关于生成矩阵和校验矩阵的定理 7.5.3 译码步骤 7.6 hamming码 7.7 bch码 习题 第8章 组合算法简介 8.1 归并排序 8.1.1 算法 8.1.2 举例 8.1.3 复杂性分析 8.2 快速排序 8.2.1 算法的描述 8.2.2 复杂性分析 8.3 ford-johnson排序法 8.4 排序的复杂性下界 8.5 求第是个元素 8.6 排序网络 8.6.1 0-1原理 8.6.2 bn网络 8.6.3 复杂性分析 8.6.4 batcher奇偶归并网络 8.7 快速傅里叶变换 8.7.1 问题的提出 8.7.2 预备定理 8.7.3 快速算法 8.7.4 复杂性分析 8.8 dfs算法 8.9 bfs算法 8.10 αβ剪技术 8.11 状态与图 8.12 分支定界法 8.12.1 tsm问题 8.12.2 任务安排问题 8.13 最短树与kruskal算法 8.14 huffman树 8.15 多段判决 8.15.1 问题的提出 8.15.2 最佳原理 8.15.3 矩阵链积问题 8.15.4 图的两点间最短路径

33,008

社区成员

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

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