正数前置
设任意n个整数存放于数组A[1···n]中,请将所有正数排在所有负数前面(要求时间复杂度为O(n))。
#include<stdio.h>
void Arrange(int A[],int t)
//n个整数存于数组A中,本算法将数组中所有正数排在所有负数的前面
{ int i=1,j=t,x;
while(i<j)
{ while(i<j && A[i]>0)
i++;
while(i<j && A[j]<0)
j--;
if(i<j&&A[i]<0&&A[j]>0)
{ x=A[i];
A[i++]=A[j];
A[j--]=x;
}//交换A[i] 与A[j]
}
for(int j=1;j<=t;j++){
printf("%d ",A[j]);
}
printf("\n");
}
int main()
{
int n,x,a[255];
printf("请输入数据个数:");
scanf("%d",&n);
printf("数据输入:\n");
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
Arrange(a,n);
return 0;
}
思路:从第一个数(i=1)和最后一个数(j=n)开始双向遍历,如果a[i]为正数那么i++,如果a[j]为负数那么j–,然后在i<j的情况下如果a[i]<0并且a[j]>0然后交换数据。