#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 + actualsize / 2; do { 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++; } while (left < middle && middle < join + actualsize); } } }