A-A+
设数组A[2n]中存放有n个负数和n个正数 且随机存放。现要求按负数 正数相问存放 请写出实
问题详情
设数组A[2n]中存放有n个负数和n个正数,且随机存放。现要求按负数、正数相问存放,请写出实现此要求的算法。算法要求:不能使用额外的存储空间,但可使用少量工作单元,算法的时间复杂度应为O(n)。
请帮忙给出正确答案和分析,谢谢!
参考答案
正确答案:void arrange(int A[]int n){int forwadback;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[0],A[2],…,A[2n一2]位置应该都存放负数,A[1],A[3],…,A[2n-1]位置上应该存放正数。可以设计两个索引forward和back,初始分别执行第一个位置和最后一个位置,forward每次都递增2,back每次都递减2,直到forward所指位置的元素为正数,back所指元素为负数,然后交换forward和back所指元素。一直到遍历完数组中的所有元素。