早教吧作业答案频道 -->其他-->
求一个算法设数组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...的网友还看了以下:
投影面积怎么计算?举个例子,长宽高各100mm,其投影面积怎么算,请写出具体算法, 2020-05-14 …
用一个酒瓶盖装满酒,然后点着,等酒精燃尽之后,剩余溶液约占48%,请问酒在燃烧之前的酒精含量是多少 2020-05-14 …
三个以上的力的合成?为什么三个以上的合力不能像这样计算?:设有三个力F1、F2、F3,计算出F1、 2020-05-22 …
一道根式计算,以前的都忘了,2次方根号3减3次方根号2分之根号2减根号3,√代表根号,这是一个根号 2020-06-06 …
圆的断面积哎数学不好.一个圆的周长1.4米怎么换算成她的断面积?先算成圆的直径?在半径?然后再怎么 2020-07-03 …
为了学生的卫生,刘老师准备给每个住宿生配一个水杯,每只水杯3元,向阳商厦打九折,千禧超市“买八送一 2020-07-14 …
圆锥形的体积公式!(请看详情)有一个圆锥形.它的顶部不是尖的,是平的,也就是说它有两个平面,怎么算 2020-07-16 …
一道有关倒数的列式计算,请列出算式:一个自然数与它的倒数的差是49.98,这个数是多少? 2020-07-17 …
请教一个算术题(P*1000-5000)/P*1000=30%求P=?如何计算?请列出解题步骤.谢谢 2020-11-13 …
这个求积分怎么算∫x^2e^(-x)dx怎么算,请列出过程一楼的答案,第一步怎么出来的就不明白啊 2020-12-26 …