public void insertion_sort_std()
{
int[] idx = { 5, 1, 2, 3, 4, 0 };
double[][] points =
{
new double[] { 2, 3 },
new double[] { 5, 4 },
new double[] { 9, 6 },
new double[] { 4, 7 },
new double[] { 8, 1 },
new double[] { 7, 2 },
};
var comparisons = new List<Tuple<double, double>>();
double[] e = points[idx[0]];
Func<double[], double[], int> comparer = (double[] x, double[] y) =>
{
var d1 = Distance.Euclidean(e, x);
var d2 = Distance.Euclidean(e, y);
comparisons.Add(Tuple.Create(d1, d2));
return d1.CompareTo(d2);
};
Sort.NthElement(points, idx,
first: 1,
last: 5,
n: 2,
compare: comparer);
int[] expected = { 5, 4, 1, 2, 3, 0 };
Assert.IsTrue(idx.IsEqual(expected));
Assert.AreEqual(5, comparisons.Count);
Assert.AreEqual(4.47213595499958, comparisons[0].Item1);
Assert.AreEqual(2.8284271247461903, comparisons[0].Item2);
Assert.AreEqual(4.47213595499958, comparisons[1].Item1);
Assert.AreEqual(2.8284271247461903, comparisons[1].Item2);
Assert.AreEqual(5.8309518948453007, comparisons[2].Item1);
Assert.AreEqual(2.8284271247461903, comparisons[2].Item2);
Assert.AreEqual(5.8309518948453007, comparisons[3].Item1);
Assert.AreEqual(4.47213595499958, comparisons[3].Item2);
Assert.AreEqual(1.4142135623730951, comparisons[4].Item1);
Assert.AreEqual(2.8284271247461903, comparisons[4].Item2);
}