rendered paste body#define swap(x,t,y) do { t=x; x=y; y=t; } while(0)
void inplace_merge(int numbers[], int count)
{
int split, join, size, actualsize, t;
int left, middle;
//sort pairs of numbers
for (split = 0; split < count; split += 2)
{
if (split < count-1)
{
if (numbers[split] > numbers[split+1])
swap(numbers[split], t, numbers[split + 1]);
}
}
//then merge progressively large chunks
for (size = 4; size < count * 2; size *= 2)
{
for (join = 0; join < count; join += size)
{
actualsize = count - join;
if (actualsize > size)
actualsize = size;
left = join;
middle = join + size / 2;
while (left < middle && middle < join + actualsize)
{
if (numbers[left] > numbers[middle])
{
t = numbers[middle];
/* this is a nasty hack, that simply moves
* the left array right one to avoid squashing
* data
*/
memmove(&numbers[left+1], &numbers[left], sizeof(int)*(middle-left));
numbers[left++] = t;
middle++;
} else
left++;
}
}
}
}