private static int Partition(IComparable[] a, int lo, int hi) { int i = lo, j = hi + 1; IComparable v = a[lo]; while (true) { while (SortHelper.Less(a[++i], v)) { if (i == hi) { break; } } while (SortHelper.Less(v, a[--j])) { if (j == lo) { break; } } if (i >= j) { break; } SortHelper.Exchange(a, i, j); } SortHelper.Exchange(a, lo, j); return(j); }
private static int Partition <Key>(Key[] a, IComparer <Key> c, int lo, int hi) where Key : class { int i = lo, j = hi + 1; Key v = a[lo]; while (true) { while (SortHelper.Less(c, a[++i], v)) { if (i == hi) { break; } } while (SortHelper.Less(c, v, a[--j])) { if (j == lo) { break; } } if (i >= j) { break; } SortHelper.Exchange(a, i, j); } SortHelper.Exchange(a, lo, j); return(j); }
public void SelectTest() { String[] a = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; Shuffle.Do(a); String v = QuickSelect.Select(a, 3) as String; Assert.IsNotNull(v); Assert.AreEqual("3", v); for (int i = 0; i < 3; i++) { Assert.IsTrue(SortHelper.Less(a[i], v)); } Assert.AreEqual(a[3], v); }
public void SelectWithComparerTest() { Point[] points = new Point[10]; for (int i = 0; i < 10; i++) { points[i] = new Point(i, 10 - i); } Shuffle.Do(points); Point v = QuickSelect.Select(points, Point.X_ORDER, 3) as Point; Assert.IsNotNull(v); Assert.AreEqual(3, v.X); Assert.AreEqual(7, v.Y); for (int i = 0; i < 3; i++) { Assert.IsTrue(SortHelper.Less(Point.X_ORDER, points[i], v)); } Assert.AreEqual(points[3], v); }