递归排序列表

时间:2018-01-23 07:50:40

标签: sorting recursion logic

在学校我们学习了递归,这是一个相当容易理解的概念。但要理解为什么在某些情况下应该使用它是相当令人困惑的。以递归方式浏览目录或计算因子和类似的东西是很有意义的,但是,我的老师提到递归适用于排序列表。

怎么样?任何人都可以解释我为什么(如果可能的话,你会怎么做)?

提前致谢。

3 个答案:

答案 0 :(得分:1)

“排序列表”递归的一个很好的例子是快速排序算法,它具有数量级,平均为O(n log n),最差情况为:O(n²)

以下是https://www.geeksforgeeks.org/quick-sort/

的一个很好的例子
/* low  --> Starting index,  high  --> Ending index */
quickSort(arr[], low, high)
{
    if (low < high)
    {
        /* pi is partitioning index, arr[pi] is now
           at right place */
        pi = partition(arr, low, high);

        quickSort(arr, low, pi - 1);  // Before pi
        quickSort(arr, pi + 1, high); // After pi
    }
}

答案 1 :(得分:0)

一个简单的原因是,在对列表进行排序时,不需要知道函数的重复大小或次数,并且#34;或执行。算法将运行直到满足最终条件(例如,当按升序排序数字时,最大数字位于最后一个索引处)。

答案 2 :(得分:0)

假设“list”相当于数组而不是链表,那么像quicksort这样的排序算法是递归的。另一方面,迭代自下而上合并排序通常比递归自顶向下合并排序快一点,并且大多数具有合并排序变体的实际库使用自下而上的迭代变换合并排序。

与迭代相比,使用递归计算阶乘是缓慢的,因为值被推送到堆栈而不是基于寄存器的计算(假设是优化编译器)。

递归的最坏情况之一是使用递归计算Fibonacci数,时间复杂度为O(2 ^ n),而时间复杂度为O(n)的迭代。

在某些情况下,编译器可能会将一种称为“尾递归”的递归转换为循环。