Here's my version as concise as I could get it. Hope it's useful. I made a recursive printing function to print the final array too.
CODE
#include<stdio.h>
plusminusorder(int a[],int low, int len)
{
if (low == len)
return 0;
int mid = (low + len)/2;
mid = partition(a, low, len, mid);
if (low<mid)
plusminusorder(a, low, mid-1);
if (mid<len)
plusminusorder(a, mid+1, len);
}
int partition (int a[], int low, int high, int mid)
{
if (mid != low)
swap (a, low, mid);
mid = low;
low++;
while (low <= high)
{
if (a[low] <= a[mid])
{
low++;
}
else if (a[high] > a[mid])
{
high--;
}
else
{
swap(a,low,high);
}
}
if (high != mid)
swap(a, mid, high);
return high;
}
swap (int v[], int p1, int p2)
{
int t;
t = v[p1];
v[p1] = v[p2];
v[p2] = t;
}
printArr(int a[], int p, int aLen)
{
if (p>aLen)
return;
else
{
printf("%d: %d\n", p, a[p]);
printArr(a, p+1, aLen);
}
}
int main()
{
int a[7]={1,2,3,-8,9,0,156};
int low = 0;
plusminusorder(a, low, 7);
printArr(a, 0, 6);
return 0;
}