Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 快速排序算法中的递归函数是如何工作的?_C#_Algorithm_Quicksort - Fatal编程技术网

C# 快速排序算法中的递归函数是如何工作的?

C# 快速排序算法中的递归函数是如何工作的?,c#,algorithm,quicksort,C#,Algorithm,Quicksort,首先,我一直在寻找这个问题的答案,但我仍然没有找到简单直接的答案 无论如何,我将要了解快速排序算法是如何工作的,我已经了解了它的分区是如何工作的,以及为什么它是最好的排序算法之一。但是由于我是递归函数的新手,我只知道基本的,所以我无法理解下面的代码是如何工作的 static public void SortQuick(int[] arr, int left, int right) { // For Recursion if (left <

首先,我一直在寻找这个问题的答案,但我仍然没有找到简单直接的答案

无论如何,我将要了解快速排序算法是如何工作的,我已经了解了它的分区是如何工作的,以及为什么它是最好的排序算法之一。但是由于我是递归函数的新手,我只知道基本的,所以我无法理解下面的代码是如何工作的

    static public void SortQuick(int[] arr, int left, int right)
    {
        // For Recursion  
        if (left < right)
        {
            int pivot = Partition(arr, left, right);

            // This "if statement" is for left partition (correct me if i'm wrong)
            if (pivot > 1)
            {
                SortQuick(arr, left, pivot - 1);
            }

            // And this "if statement" is for right partition (again, correct me if i'm wrong)
            if (pivot + 1 < right)
            {
                SortQuick(arr, pivot + 1, right);
            }
        }
    }
我使用VisualStudio断点来理解它的递归,但我仍然感到困惑。如果第二个if语句的输出发生了变化,我不明白为什么要把它改成else,我也不明白递归是如何结束的


注:我没有使用分区方法,因为我已经理解了它的工作原理。

我将专门回答问题的第二部分。它不可能是一个else if。算法如下:

我能把你的单子分成左半部分和右半部分吗? 我有左半边的吗?如果我这样做了,那么对左半部分进行排序。 我有右半个吗?如果我做了一个排序,然后对右半部分进行排序。 之所以不能使用else-if,是因为在某些情况下,需要同时对左半部分和右半部分进行排序

在分区没有找到更小的列表进行排序的情况下,递归自然结束


为了进一步研究,我推荐YouTube和Wikipedia。

递归是在越来越小的列表上重复这个过程,直到您只获得单个项目的列表

两个if语句正在检查轴心点是列表中最左侧还是最右侧的项。当它是最左侧的轴=1时,它停止在左侧创建列表。当它是最右边的pivot+1=right时,它停止在右边创建列表

当你到达一个项目时,无论是最左边的还是最右边的,它都将停止进一步分解它。

你可以参考快速排序算法的逐步处理

为什么是“如果”而不是“如果”


这是因为在将一个元素固定在正确的位置之后,我们将得到一个左子数组和一个右子数组,我们需要对这两个数组执行相同的操作,这就是为什么我们将两个单独的if替换为else if,如果

为了让您理解,我已经完成了它的超短实现。看:

void QuickSort(int arr[], int left, int right){
    int pos = (left + right)/2;                  //get middle position of array
    int pivot = arr[pos];                        //stores the value of pivot
    swap(arr[pos], arr[right]);                  //put pivot in the end of array
    int i = left, j = right- 1;                  //initialize pointers

    while(i <= j){
        while(arr[i] < pivot) i++;               //move left
        while(arr[j] >= pivot && j >= i) j--;    //move right
        if(i < j) swap(arr[i++], arr[j--]);      //swap (and walk) if possible
    }

    swap(arr[i], arr[right]);                    //return pivot to right position
    if(i - left) QuickSort(arr, left, i - 1);    //recursion if left subarray isn't empty
    if(right- i) QuickSort(arr, i + 1, right);   //recursion if right subarray isn't empty
}

基本上,递归是在分区函数中使用的,它总是在左、右子数组不为空的情况下执行。

仔细检查算法,然后它就会被清除