public static SortResult Sort(this ISorter sorter, ISortable sortable) { var stageUse = new bool[sorter.StageCount]; var curPerm = sortable.GetPermutation(); for (var i = 0; i < sorter.StageCount; i++) { var res = sorter[i].Sort(curPerm); stageUse[i] = res.Item1; curPerm = res.Item2; } var ssq = Math.Sqrt(curPerm.SortednessSq()); return(new SortResult( sorter: sorter, sortedness: ssq, stageUse: stageUse, sortable: sortable, result: curPerm)); }