Hello,

>>>

        public class Sort<T>  {
                public delegate int Comparison (T v0, T v1);

You don't need yet another delegate, just use standard Func


                static readonly int INSERTIONSORT_THRESHOLD = 7;

Why not to used const int ?


More importantly what is performance of sorting array of 10-20 elements called 1000000 times ?

Thanks
Marek

Attached you'll find qsort.cs which includes 3 QuickSort implementations:

1. QuickSortBasic[R]: This is a basic QuickSort implementation and the one currently in use as the sorting function in Array.Sort(). This implementation always uses the middle element as the pivot.

2. QuickSortMedian[R]: This implementation is also a basic QuickSort implementation which attempts choose a better pivot based on the first, last, and middle elements. For sorted inputs and random inputs, this seems to help performance somewhat as the array gets larger and larger. However, for reverse-sorted inputs, it seems to kill performance. Perhaps if I choose 3 random points to feed into Median() it will do better.

3. QuickSortInsertion[R]: This implementation includes the above perf trick and also includes an Insertion Sort fallback when partitions are broken down smaller than some threshold # of elements (7 in the attached code). It also falls back to Insertion Sort when it encounters a worst-case scenario. As always, the performance improvement with this is greater as the number of elements increases and/or as the comparison function becomes more complex.


You'll notice that the attached test program will print out the number of comparisons that each sort routine uses in order to complete its job. It's important to keep in mind that the more complex the comparison function is, the more important it is that the number of comparisons is kept to a minimum.

Here are some example runs:


[fejj@warpig sorting]$ mono ./qsort.exe -random 100000000
Basic QuickSort comparisons needed:     3807986012
QuickSort+Median comparisons needed:    3077915654
QuickSort+Insertion comparisons needed: 3021355043
Basic QuickSort finished in:     00:00:43.8178721s
QuickSort+Median finished in:    00:00:37.3047443s
QuickSort+Insertion finished in: 00:00:36.6122681s


[fejj@warpig sorting]$ mono ./qsort.exe -sorted 100000000
Basic QuickSort comparisons needed:     2632227866
QuickSort+Median comparisons needed:    2632227867
QuickSort+Insertion comparisons needed: 2483222808
Basic QuickSort finished in:     00:00:21.8213618s
QuickSort+Median finished in:    00:00:21.2622527s
QuickSort+Insertion finished in: 00:00:19.0837352s


(Note: I reduced the array size here due to wanting to head home for dinner)
[fejj@warpig sorting]$ mono ./qsort.exe -reversed 10000
Basic QuickSort comparisons needed:     129546
QuickSort+Median comparisons needed:    12522499
QuickSort+Insertion comparisons needed: 39993
Basic QuickSort finished in:     00:00:00.0016905s
QuickSort+Median finished in:    00:00:00.0911385s
QuickSort+Insertion finished in: 00:00:00.0008721s


Jeff


_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to