不解的MergeSort
2010-08-15 10:03 yearN 阅读(327) 评论(0) 收藏 举报最近在学习Power Collections类库,其中Algorithm类中有这么一个算法:
/// <summary>
/// Merge several sorted collections into a single sorted collection. Each input collection must be sorted
/// by the ordering in the passed instance of IComparer<T>. The merging
/// is stable; equal items maintain their ordering, and equal items in different collections are placed
/// in the order of the collections.
/// </summary>
/// <param name="collections">The set of collections to merge. In many languages, this parameter
/// can be specified as several individual parameters.</param>
/// <param name="comparer">The comparer instance used to sort the list. Only
/// the Compare method is used.</param>
/// <returns>An IEnumerable<T> that enumerates all the items in all the collections
/// in sorted order. </returns>
public static IEnumerable<T> MergeSorted<T>(IComparer<T> comparer, params IEnumerable<T>[] collections)
{
if (collections == null)
throw new ArgumentNullException("collections");
if (comparer == null)
throw new ArgumentNullException("comparer");
IEnumerator<T>[] enumerators = new IEnumerator<T>[collections.Length];
bool[] more = new bool[collections.Length];
T smallestItem = default(T);
int smallestItemIndex;
try {
// Get enumerators from each collection, and advance to the first element.
for (int i = 0; i < collections.Length; ++i) {
if (collections[i] != null) {
enumerators[i] = collections[i].GetEnumerator();
more[i] = enumerators[i].MoveNext();
}
}
for (; ; ) {
// Find the smallest item, and which collection it is in.
smallestItemIndex = -1; // -1 indicates no smallest yet.
for (int i = 0; i < enumerators.Length; ++i) {
if (more[i]) {
T item = enumerators[i].Current;
if (smallestItemIndex < 0 || comparer.Compare(smallestItem, item) > 0) {
smallestItemIndex = i;
smallestItem = item;
}
}
}
// If no smallest item found, we're done.
if (smallestItemIndex == -1)
yield break;
// Yield the smallest item.
yield return smallestItem;
// Advance the enumerator it came from.
more[smallestItemIndex] = enumerators[smallestItemIndex].MoveNext();
}
}
finally {
// Dispose all enumerators.
foreach (IEnumerator<T> e in enumerators) {
if (e != null)
e.Dispose();
}
}
}
MergeSort意思应该可以理解为“归并排序”吧,可这个算法怎么看也不像经典的归并排序,以前我也没遇到过这种排序,感觉这个算法不怎么效率。
附上园友的归并排序算法:
http://www.cnblogs.com/architect/archive/2009/05/06/1450489.html
浙公网安备 33010602011771号