private static void QuickSortNodes( ref XmlDiffNode firstNode, ref XmlDiffNode lastNode, int count, XmlDiffNode firstPreviousSibbling, XmlDiffNode lastNextSibling) { var sortArray = new XmlDiffNode[(int)checked ((uint)count)]; var xmlDiffNode = firstNode; var index1 = 0; while (index1 < count) { sortArray[index1] = xmlDiffNode; ++index1; xmlDiffNode = xmlDiffNode._nextSibling; } XmlDiff.QuickSortNodesRecursion(ref sortArray, 0, count - 1); for (var index2 = 0; index2 < count - 1; ++index2) { sortArray[index2]._nextSibling = sortArray[index2 + 1]; } if (firstPreviousSibbling == null) { firstNode._parent._firstChildNode = sortArray[0]; } else { firstPreviousSibbling._nextSibling = sortArray[0]; } sortArray[count - 1]._nextSibling = lastNextSibling; firstNode = sortArray[0]; lastNode = sortArray[count - 1]; }
private static void QuickSortNodesRecursion( ref XmlDiffNode[] sortArray, int firstIndex, int lastIndex) { var position = sortArray[(firstIndex + lastIndex) / 2].Position; var firstIndex1 = firstIndex; var lastIndex1 = lastIndex; while (firstIndex1 < lastIndex1) { while (sortArray[firstIndex1].Position < position) { ++firstIndex1; } while (sortArray[lastIndex1].Position > position) { --lastIndex1; } if (firstIndex1 < lastIndex1) { var xmlDiffNode = sortArray[firstIndex1]; sortArray[firstIndex1] = sortArray[lastIndex1]; sortArray[lastIndex1] = xmlDiffNode; ++firstIndex1; --lastIndex1; } else if (firstIndex1 == lastIndex1) { ++firstIndex1; --lastIndex1; } } if (firstIndex < lastIndex1) { XmlDiff.QuickSortNodesRecursion(ref sortArray, firstIndex, lastIndex1); } if (firstIndex1 >= lastIndex) { return; } XmlDiff.QuickSortNodesRecursion(ref sortArray, firstIndex1, lastIndex); }