Regarding implementing a stable sort for Phobos

Xinok xinok at live.com
Tue Mar 13 08:52:32 PDT 2012


On Tuesday, 13 March 2012 at 14:31:59 UTC, Andrei Alexandrescu 
wrote:
> On 3/13/12 1:31 AM, Xinok wrote:
>> - It's a natural merge sort, which is faster on partially 
>> sorted lists,
>> and adds little overhead for mostly random lists.
>> - It uses O(log n log n) additional space for merging.
>
> That's 1024 when n is 4 billion. I think you can safely 
> approximate it with alloca or a fixed-size stack-allocated 
> array.

How about stack allocated for small lists, and heap allocated for 
larger lists? e.g. Limit the stack to 1KiB and use the heap for 
anything larger.

>> - I wrote it to sort random-access ranges *without* slicing, 
>> but I think
>> the exclusion of slicing makes it slower. I'm writing a 
>> separate
>> implementation which uses slicing and I'll keep it if it's 
>> much faster.
>
> Having random access implies having slicing.
>
>> - To avoid multiple allocations, the user can allocate their 
>> own
>> temporary memory and pass it to the sort function.
>
> If you need different allocation strategies, I suggest you make 
> it a policy (like stability is).
>
>> - I decided against using pointers. While I could use them to 
>> write
>> highly optimized code for arrays, pointers can't be used in 
>> safe code
>> and don't work very well in CTFE at the moment.
>
> Perhaps it's best to have two distinct implementations guarded 
> by if (__ctfe). The runtime implementation can be @trusted.

If the performance gain is great enough, I'll consider doing that.

>> Is it worth keeping the implementation *without* slicing? Many 
>> functions
>> in Phobos do require slicing, including the unstable sort, and 
>> I think
>> most random-access ranges do or could support slicing.
>
> No need.

I'll leave it out of Phobos.

>> What would you prefer in terms of memory usage vs performance? 
>> O(n/2)
>> space is optimal for performance, O(1) (in-place) requires zero
>> allocations but is slower, and O(log n log n) provides a good 
>> balance.
>
> The latter rounded up to a constant sounds best.
> 
>> Should I implement concurrency? Merge sort is very easy to 
>> parallelize,
>> and being in-place or natural doesn't change this fact.
>
> Let's save that for std.parallel_algorithm.

I'll leave it out of Phobos for now.


More information about the Digitalmars-d mailing list