Quicksort算法如何终止递归函数?

时间:2017-01-31 06:57:03

标签: c# sorting recursion quicksort

我尝试使用断点,以便我可以了解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)

我已经理解了分区流程,所以我没有在我的问题中包含它。提前致谢。 :)

2 个答案:

答案 0 :(得分:3)

经常教会一种递归函数总是必须有两种情况:递归情况和终止情况。通常不清楚的是终止案件唯一需要的是不能递归

在递归图的叶节点处,您有left < right不为真的调用(例如left == 0pivot == 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只返回。

这是

的副本

How the recursion in Quicksort algorithm works?

相关问题