C# 下面的快速排序方法是如何工作的?

C# 下面的快速排序方法是如何工作的?,c#,algorithm,linq,quicksort,partitioning,C#,Algorithm,Linq,Quicksort,Partitioning,出于教育目的,我编写了自己的快速排序方法。为了改进它,我查看了.NET源代码以了解如何实现LINQOrderBy()方法 我发现: 为什么我们在划分之后只递归轴的一侧? (根据if(j-left)的结果,CompareKeys方法做什么?我很难理解它。它根据使用OrderBy()和ThenBy()方法(使用keyselector lamdbas)定义的键来比较两个元素。这些键在排序之前计算一次(为了避免每次需要比较两个项目时都计算它们)。map[]是一个数组,包含这些键的索引。在进行排序时,您交

出于教育目的,我编写了自己的快速排序方法。为了改进它,我查看了.NET源代码以了解如何实现LINQ
OrderBy()
方法

我发现:

为什么我们在划分之后只递归轴的一侧?
(根据if(j-left)的结果,CompareKeys方法做什么?我很难理解它。它根据使用
OrderBy()
ThenBy()
方法(使用keyselector lamdbas)定义的键来比较两个元素。这些键在排序之前计算一次(为了避免每次需要比较两个项目时都计算它们)。
map[]
是一个数组,包含这些键的索引。在进行排序时,您交换这些索引,而不是要排序的实际对象。第一部分:这确实是要做的:如
DepthLimitedQuickSort()中所述
method for
Array.Sort()
No,链接描述了另一种排序方法-切换到另一种排序方法(introsort同时使用quicksort和heapsort代码段)。wiki页面中提到了关于quicksort的第一部分,并在一些算法课程(如Sedgewick book)中进行了描述。
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);
}
void QuickSort(int[] map, int left, int right)
{
    if (left < right)
    {
        int i = left - 1;
        int j = right + 1;
        int x = map[left + ((right - left) >> 1)];

        while (true)
        {
            do { i++; } while (Compare(map[i], x) < 0);
            do { j--; } while (Compare(map[j], x) > 0);

            if (i >= j) break;

            int temp = map[i];
            map[i] = map[j];
            map[j] = temp;
        }

        QuickSort(map, left, j);
        QuickSort(map, j + 1, right);
    }
}