Idempotent partition around median of 5?

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Wed Feb 3 17:24:15 PST 2016


This appears a simple problem: given numbers a, b, c, d, e, swap them 
around so as to place the median in c and partition the others around 
it. I.e. the postcondition is: a <= c && b <= c && c <= d && c <= e.

Searching the Net for this isn't easy. Fortunately "our own" Xinok has 
the best of breed result, see 
http://stackoverflow.com/questions/11065963/possible-to-partition-five-elements-by-median-with-six-comparisons.

His algorithm is a little suboptimal in that when given a sorted array, 
it sometimes leaves it unsorted. So I changed it to 
http://dpaste.dzfl.pl/5fb2238d9891 to fix that. If I count right, it 
also saves one swap: does 0-9 swaps instead of 0-10.

Ideally however, such an algorithm would do 0 swaps if the median is 
already in c. My algorithm may still swap d and e without necessity.

So there's got to be a better solution. Your challenge - should you 
choose to accept it :o) - is an algorithm that does the partitioning in 
6 comparisons and <= 9 swaps, which is idempotent: when applied twice, 
it always does 0 swaps.


Andrei



More information about the Digitalmars-d mailing list