一个长度为n数组由负数0和正数组成,将其重新排列为前面是负数中间是0后面是正数的结构,要求时间复杂度为n
写了一个:
#define LENGTH 10
void exchange(int* a, int* b){
int t = a;
*a = *b;
*b = t;
}
/*sort to 3 groups/
void main(){
int a[LENGTH] = {-1,0,0,2,0,4,-11,-89,0,100};
int i = 0, head = 0, tail = LENGTH -1;
printf("Data:\n");
while(i < LENGTH) printf("%d ",a[i++]);
printf("\n");
i = 0;
while(i <= tail){
printf("a[%d]:%d\n",i, a[i]);
if(a[i] > 0)
{
if (i != tail)
exchange(&a[i],&a[tail]);
tail--;
printf("tail:%d\n",tail);
}
else
{
if(a[i] < 0)
{
if (i != head)
exchange(&a[i],&a[head]);
head++;
printf("head:%d\n",head);
}
i++;
}
}
i = 0;
printf("After:\n");
while(i < LENGTH) printf("%d ",a[i++]);
printf("\n");
}
代码我就不写了,C语言早不用了,但是思路我觉得时间复杂度要求高的话就只能用空间复杂度来换了,说白了,你在用其他三个数组去分别装负数,0,正数
,这样遍历一遍原数组的时间复杂度正好是n,最后把三个数组的数再装回来不久完了.