Ordering an array of negatives, zero and positives integers with one iteration
C, 92
This could probably be reduced by at least 10 bytes; there are many expressions going to waste.
The first argument should point to the beginning of the array; the second should point after the end of the array.
*x;f(b,e)int*b,*e;{for(x=b;x&lt;e;x++)*x&gt;0&amp;&amp;--e-x?*x--^=*e^=*x^=*e:*x&lt;0?b-x?*x^=*b=*x:0,b++:0;}

Ungolfed with random test generator:
*x;
f(b,e)int*b,*e;{
    for(x=b;x&lt;e;x++) {
        if(*x&lt;0) {
            if(b == x)
                b++;
            else
                *b++ = *x, *x=0;
        } else if(*x&gt;0 &amp;&amp; x != --e) {
            *x^=*e^=*x^=*e;
            x--;
        }
    }
}

int main()
{
    int a[999];
    srand(time(0));
    int n = rand() % 50;
    int i;
    for(i = 0; i &lt; n; i++) printf(&quot;%d &quot;, a[i] = rand() % 9 - 4);
    f(a, a+n);
    puts(&quot;&quot;);
    for(i = 0; i &lt; n; i++) printf(&quot;%d &quot;, a[i]);
    return 0;
}