早教吧作业答案频道 -->其他-->
求一个算法设数组A[1..2n]中存放有n个负数和n个正数,且随机存放.现要求按负数正数相间存放.请写出实现此要求的算法.算法要求:不能使用额外的存储空间,但可使用少量工作单元,算法的时间
题目详情
求一个算法
设数组A[1..2n]中存放有n个负数和n 个正数,且随机存放.现要求按负数正数相间存放.请写出实现此要求的算法.算法要求:不能使用额外的存储空间,但可使用少量工作单元,算法的时间复杂度应为O(n).
设数组A[1..2n]中存放有n个负数和n 个正数,且随机存放.现要求按负数正数相间存放.请写出实现此要求的算法.算法要求:不能使用额外的存储空间,但可使用少量工作单元,算法的时间复杂度应为O(n).
▼优质解答
答案和解析
相间存放,说明如果所有负数在奇数位置上,则所有正数在偶数位置上,反之亦然.假设把所有负数都放奇数位置上,所有正数都放偶数位置上,则A[0],A[2],...,A[2n-2]位置应该都存放负数,A[1],A[3],...,A[2n-1]位置上应该存放正数.可以设计两个索引forward和back,初始分别执行第一个位置和最后一个位置,forward每次都递增2,back每次都递减2,直到forward所指位置的元素为正数,back所指元素为负数,然后交换forward和back所指元素.一直到遍历完数组中的所有元素.
参考程序:
void arrange(int a[],int n)
{
int forwad,back;
forward = 0;
back = 2*n-1;
while(forward < 2*n - 1 && back > 0)
{
while(forward < 2*n - 1 && a[forward] < 0)
forward += 2;
while(back > 0 && a[back] > 0)
back -= 2;
if(back > 0)
{
int temp;
temp = a[forward];
a[forward] = a[back];
a[back] = temp;
}
}
}
参考程序:
void arrange(int a[],int n)
{
int forwad,back;
forward = 0;
back = 2*n-1;
while(forward < 2*n - 1 && back > 0)
{
while(forward < 2*n - 1 && a[forward] < 0)
forward += 2;
while(back > 0 && a[back] > 0)
back -= 2;
if(back > 0)
{
int temp;
temp = a[forward];
a[forward] = a[back];
a[back] = temp;
}
}
}
看了 求一个算法设数组A[1..2...的网友还看了以下:
数量积问题,若a平行于b,且存在不等于零的实数k,t使得[a(t^2-3)b]向量a=(√3,-1 2020-05-14 …
已知平面α与平面β相交,直线m⊥α,则()A.β内必存在直线与m平行,且存在直线与m垂直B.β内不 2020-05-24 …
英语翻译以下内容是关于洗衣粉产品:现在贵公司产品已经在我公司仓库存放时间超过了3个月,请尽快安排出 2020-06-14 …
堆肥过程发生的变化是()A.无机物合成有机物,并且存能量B.无机物合成有机物,并且释放能量C.有机 2020-06-17 …
高数证明问题1.设函数f(x)在闭区间[0,A]上连续,且f(0)=0,如果f'(x)存在且为增函 2020-08-01 …
已知直线l过A(-3,1),且倾斜角为45°已知直线L过点A(-3,1),且倾斜角为45°,直线L 2020-08-01 …
高数问题,急求设函数fx,gx在(a,b)上连续且可导,在(a,.b〉内二介可导,且存在相等的最大值 2020-11-03 …
设函数fx,gx在(a,b)上连续且可导,在(a,.b〉内二介可导,且存在相等的最大值,f(a)=g 2020-11-03 …
f(x)在[a,b]上连续(a,b)上可导,且f(a)=f(b)=0证明任取k属于R,存在ξ属于(a 2020-11-03 …
1)设f(x)在[a,b]上可微,且f(a)=f(b)=0,证明:在(a,b)内存在一点ξ,使f'( 2020-12-28 …