早教吧作业答案频道 -->其他-->
求一个算法设数组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...的网友还看了以下:
有一道题目hopeeveryonehelpme,OK?一件工作,甲乙合作5天完成了全部工作的5/6 2020-05-20 …
一件工作,甲单独做需要20天完成,乙需要30天完成,如果两人合作,将互相影响,使甲的工作效率只有原 2020-05-20 …
你雇一个工人做七天工作,每天都要给他工钱,并且每天工钱相等.你只有一块金砖,只能切两刀,怎么办? 2020-06-10 …
施工队要在一东西长600米的礼堂顶部沿东西方向安装一排吊灯,根据施工要求,必须在距西墙375米处安 2020-06-14 …
一船工要运一狼、一山羊和一白菜过河,每次除船工外,只能带一乘客渡河,应该如何渡河?一个船工要运一匹 2020-07-04 …
某工程队要招聘甲乙两种工人150人,应支付甲乙两种工种的工人的月工资分别为600元和800元,但工 2020-07-06 …
英语翻译不仅拖延了工期而且给工程造成了不应有的损失和浪费,影响了工程的经济效益和社会效益.由此在事故 2020-11-06 …
已知甲工程队比乙工程队每天能多铺设20M且甲工程队铺设350m所用的天数与乙工程队铺设250m所用的 2020-11-06 …
某电视机厂生产某一零件,需要两道工序,并且第一道工序比第二道工序慢一倍,已知第一车间有140人,第二 2020-12-01 …
某工程队要招聘甲、乙两种工人两种工人150人,某工程队要招聘甲,乙两工种工人150人,应支付甲,乙两 2020-12-01 …