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
}
基本上,递归是在分区函数中使用的,它总是在左、右子数组不为空的情况下执行。仔细检查算法,然后它就会被清除