OrderBy函数排序算法类型

时间:2015-04-14 16:05:05

标签: c# linq sorting

我正在学习C#LINQ,我想知道使用的排序算法的类型是什么

2 个答案:

答案 0 :(得分:7)

它使用快速排序,因为它可以在source code for the EnumerableSorter类中使用,它在OrderedEnumerable类中使用,它将源IEnumerable包装在OrderBy方法中:

   void QuickSort(int[] map, int left, int right) {
        do {
            int i = left;
            int j = right;
            int x = map[i + ((j - i) >> 1)];
            do {
                while (i < map.Length && CompareKeys(x, map[i]) > 0) i++;
                while (j >= 0 && CompareKeys(x, map[j]) < 0) j--;
                if (i > j) break;
                if (i < j) {
                    int temp = map[i];
                    map[i] = map[j];
                    map[j] = temp;
                }
                i++;
                j--;
            } while (i <= j);
            if (j - left <= right - i) {
                if (left < j) QuickSort(map, left, j);
                left = i;
            }
            else {
                if (i < right) QuickSort(map, i, right);
                right = j;
            }
        } while (left < right);
    }
}

OrderedEnumerable中用于排序的算法是:

  1. 选择键
  2. 使用Hoare排序订购索引图。
  3. 根据给定的索引图从原始序列中选择(变成Buffer - some IList)项目

       //  EnumerableSorter<TElement> does #1 and #2
       internal int[] Sort(TElement[] elements, int count) {
            ComputeKeys(elements, count);
            int[] map = new int[count];
            for (int i = 0; i < count; i++) map[i] = i;
            QuickSort(map, 0, count - 1);
            return map;
        }
    
     // OrderedEnumerable<TElement>.GetEnumerator() does #3
     public IEnumerator<TElement> GetEnumerator() {
            Buffer<TElement> buffer = new Buffer<TElement>(source);
            if (buffer.count > 0) {
                EnumerableSorter<TElement> sorter = GetEnumerableSorter(null);
                int[] map = sorter.Sort(buffer.items, buffer.count);
                sorter = null;
                for (int i = 0; i < buffer.count; i++) yield return buffer.items[map[i]];
            }
        }
    
  4. P.S。:正如@JonSkeet所指出的那样QuickSort只是当前的实现。没有人知道它是否会在未来的某个版本中发生变化。可能会为小型或特定集合添加一些优化,否则算法本身将会更改。

答案 1 :(得分:0)

对于对象类型,我相信它的快速排序。但我认为它可能会根据情况和实现使用各种不同的排序算法。