All pastes #30392 Raw Edit

Someone

public text v1 · immutable
#30392 ·published 2005-11-22 22:09 UTC
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++;
                        }
                }
        }
}