/// <summary>Sorts the specified array.</summary> /// <typeparam name="T">Type of item.</typeparam> /// <param name="array">The array.</param> /// <param name="start">The start index.</param> /// <param name="length">The length.</param> public static void TimSort <T>(this IList <T> array, int start, int length, bool buffered) { length = Math.Min(length, array.Count - start); if (buffered) { BufferedListSort(array, start, length, Comparer <T> .Default.Compare); } else { ListTimSort <T> .Sort(array, start, start + length, Comparer <T> .Default.Compare); } }
/// <summary>Sorts the specified array.</summary> /// <typeparam name="T">Type of item.</typeparam> /// <typeparam name="C">Type of compared expression.</typeparam> /// <param name="array">The array.</param> /// <param name="start">The start index.</param> /// <param name="length">The length.</param> /// <param name="expression">The compared expression.</param> /// <param name="buffered">Set it to <c>true</c> if you need buffered sorting.</param> public static void TimSort <T, C>(this IList <T> array, int start, int length, Func <T, C> expression, bool buffered) { length = Math.Min(length, array.Count - start); Comparison <T> comparer = (a, b) => Comparer <C> .Default.Compare(expression(a), expression(b)); if (buffered) { BufferedListSort(array, start, length, comparer); } else { ListTimSort <T> .Sort(array, start, start + length, comparer); } }
public void Sort_Tests() { Assert.Throws(typeof(ArgumentNullException), () => { SysUtils.QuickSort <ValItem>(null, null); }); Assert.Throws(typeof(ArgumentNullException), () => { SysUtils.MergeSort <ValItem>(null, null); }); Assert.Throws(typeof(ArgumentNullException), () => { ListTimSort <int> .Sort(null, null); }); Random rnd = new Random(); List <ValItem> listQS = new List <ValItem>(); List <ValItem> listMS = new List <ValItem>(); List <ValItem> listTS = new List <ValItem>(); List <ValItem> listCS = new List <ValItem>(); //const int MaxCount = 1000000; // for performance test const int MaxCount = 1000; // for common test for (int i = 0; i < MaxCount; i++) { double val = rnd.NextDouble(); listTS.Add(new ValItem(val)); listQS.Add(new ValItem(val)); listMS.Add(new ValItem(val)); listCS.Add(new ValItem(val)); } listCS.Sort(CompareItems); SysUtils.QuickSort(listQS, CompareItems); SysUtils.MergeSort(listMS, CompareItems); ListTimSort <ValItem> .Sort(listTS, CompareItems); // test for sort valid //(only for numbers, because some methods is with the permutations, and part - no) for (int i = 0; i < MaxCount; i++) { Assert.AreEqual(listTS[i].Value, listQS[i].Value); Assert.AreEqual(listQS[i].Value, listMS[i].Value); Assert.AreEqual(listMS[i].Value, listCS[i].Value); } }