我正在学习C#LINQ,我想知道使用的排序算法的类型是什么
答案 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
中用于排序的算法是:
根据给定的索引图从原始序列中选择(变成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]];
}
}
P.S。:正如@JonSkeet所指出的那样QuickSort
只是当前的实现。没有人知道它是否会在未来的某个版本中发生变化。可能会为小型或特定集合添加一些优化,否则算法本身将会更改。
答案 1 :(得分:0)
对于对象类型,我相信它的快速排序。但我认为它可能会根据情况和实现使用各种不同的排序算法。