一个长度为n数组由负数0和正数组成,将其重新排列为前面是负数中间是0后面是正数的结构,要求时间复杂度为n

一个长度为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,最后把三个数组的数再装回来不久完了.