Quadratic time to sort in a simple case?

bearophile bearophileHUGS at lycos.com
Fri Apr 19 15:55:59 PDT 2013


Ivan Kazmenko:

> A seemingly easy way to provide the choice globally would be to 
> have an assignable SwapStrategy.default in std.algorithm... or 
> would that be a bad design decision to have such a global state?

With that I think there is no way to write a pure sort. Hopefully 
someday the sort() will be pure. Generally global mutable state 
is bad to write unittests, and to reason about code. So I don't 
think Andrei will do that. It's not kosher.


> Still, I think this is a problem in Phobos which should be 
> fixed.
>  In most implementations of quicksort (even middle-element, the 
> easiest to come up with), one expects it to perform in O(n log 
> n) with probability close to one, except on some artificially 
> constructed cases.
>
> On a side note, I'm surprised that median-of-three (getPivot in 
> std.algorithm) fails at such a simple test, so I had something 
> new to learn there, too.  If I just comment out the switch in 
> getPivot and "return mid" directly, it becomes fast enough in 
> this case.

Your case is a common one, so I think this problem should be 
studied a little better. I suggest to write a little better 
benchmark that shows the problem, and put it in Bugzilla. At 
worst it will be closed with wontfix.


> Another view at this is the following.  As far as I know by 
> now, one of the points beyond D (and Phobos) design is to have 
> everything safe by default, but faster if you want it 
> explicitly and you know what you are doing.

Right, but I think that D Zen rule is mostly about things like 
memory safety, etc.


> So, why isn't TimSort the default?

Probably because someone thinks that "on average" the other sort 
is faster.

In theory the other should be faster, because if you relax the 
constraints of the sort being stable I think in theory you should 
be able to write a little faster sorting algorithm (I don't know 
if this is true).

Bye,
bearophile


More information about the Digitalmars-d-learn mailing list