我尝试使用断点,以便我可以了解Quicksort算法中这个递归函数的工作原理。
static public void SortQuick(int[] arr, int left, int right)
{
if (left < right)
{
int pivot = Partition(arr, left, right);
if (pivot > 1)
{
SortQuick(arr, left, pivot - 1);
}
if (pivot + 1 < right)
{
SortQuick(arr, pivot + 1, right);
}
}
}
我想知道的是,当2个内部&#34; if语句&#34;变得虚伪。为什么递归不会终止?下一个过程将去哪里以及为什么?
我很困惑,因为当我试图遵循断点时 一步一步,我不明白到底发生了什么。左边= 0 并且右= 2,但是当我继续遵循断点时,它 变成了左= 5而右= 9.无论如何,4是我的第一个支点而我 输入10个数字。所以基本上,我知道代码开始了 在左侧划分右侧;这就是为什么 左变量变为5,右变为9.我只是不知道如何 这发生了,这个函数的哪个部分留下了= 5和right = 左起9 = 0,右= 2。
这就是我输入的内容:(5 1 9 2 3 8 4 7 6 10)
我已经理解了分区流程,所以我没有在我的问题中包含它。提前致谢。 :)
答案 0 :(得分:3)
经常教会一种递归函数总是必须有两种情况:递归情况和终止情况。通常不清楚的是终止案件唯一需要的是不能递归。
在递归图的叶节点处,您有left < right
不为真的调用(例如left == 0
和pivot == 1
将导致调用SortQuick(arr, 0, 0)
)和函数是一个无操作(更重要的是,它退出而不再进一步递归)。
答案 1 :(得分:0)
代码需要修复,固定行注释:
static public void SortQuick(int[] arr, int left, int right)
{
if (left < right)
{
int pivot = Partition(arr, left, right);
if (pivot - 1 > left) // this line fixed
{
SortQuick(arr, left, pivot - 1);
}
if (pivot + 1 < right)
{
SortQuick(arr, pivot + 1, right);
}
}
}
Partition()显然选择(低+高)/ 2作为枢轴索引。程序首先对数据深度进行排序,然后先进行排序。第一个实例左= = 0,右= = 9,因此分区返回(0 + 9)/ 2 = 4.下一个实例已离开== 0,右= = 3,因此分区返回2.下一个实例已离开= 0,right = 1,pivot = 1,这是一个基本情况,所以SortQuick只返回。由于2 + 1的枢轴不是&lt; 3,这也是一个基本情况,所以SortQuick再次返回。下一个实例左= 5,右= 9,枢轴= 7.看看你是否可以从这里开始跟踪该部分。
基本情况发生在(pivot - 1&lt; = left)或(pivot + 1&gt; = right),当分区大小为2或3时,在这种情况下,Partition()已对该部分进行了排序原始数组,而SortQuick只返回。
这是
的副本