想请教一个关于Linq的问题

时间:2021-12-11 10:29:29
就是请问C#   Linq排序默认使用什么算法?谢谢各位大神

4 个解决方案

#1


默认是升序。

#2


默认是快速排序,我说的是linq to objects。

#3


https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,cb26c46274356e0d

贴出部分源代码片断
internal abstract class EnumerableSorter<TElement>
    {
        internal abstract void ComputeKeys(TElement[] elements, int count);
 
        internal abstract int CompareKeys(int index1, int index2);
 
        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;
        }
 
        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);
        }
    }


看到 QuickSort( 了么

以后这种问题不要问,自己去看源代码。

#4


谢谢大家,已经理解

#1


默认是升序。

#2


默认是快速排序,我说的是linq to objects。

#3


https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,cb26c46274356e0d

贴出部分源代码片断
internal abstract class EnumerableSorter<TElement>
    {
        internal abstract void ComputeKeys(TElement[] elements, int count);
 
        internal abstract int CompareKeys(int index1, int index2);
 
        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;
        }
 
        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);
        }
    }


看到 QuickSort( 了么

以后这种问题不要问,自己去看源代码。

#4


谢谢大家,已经理解