不解的MergeSort
2010-08-15 10:03 yearN 阅读(321) 评论(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