Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Algorithm 有人能解释一下递归插入排序是如何工作的吗?_Algorithm_Sorting_Recursion_Insertion Sort - Fatal编程技术网

Algorithm 有人能解释一下递归插入排序是如何工作的吗?

Algorithm 有人能解释一下递归插入排序是如何工作的吗?,algorithm,sorting,recursion,insertion-sort,Algorithm,Sorting,Recursion,Insertion Sort,假设A是一个数组,n是A中的元素数 recursive_insertion_sort(A, n) IF n > 1 THEN recursive_insertion_sort(A, n-1) key = A[n] i = n - 1 DOWHILE A[i] > key AND i > 0 A[i+1] = A[i] i = i - 1 END

假设A是一个数组,n是A中的元素数

recursive_insertion_sort(A, n)
    IF n > 1 THEN
        recursive_insertion_sort(A, n-1)
        key = A[n]
        i = n - 1
        DOWHILE A[i] > key AND i > 0
            A[i+1] = A[i]
            i = i - 1
        ENDDO
        A[i+1] = temp
    ENDIF
END
有人能解释一下递归在这种情况下是如何工作的吗?有几件事我不明白:

  • 我不明白,如果n>1,为什么还要再次调用该函数
  • 当我们再次调用函数时,为什么要输入(n-1)?我们从n=2开始整个过程,前两个元素
  • 递归在一般情况下是如何工作的?比如,一旦我们再次调用该函数,我们是否会忽略第4行之后的代码,直接跳转到第二个调用?还是我们在第一次通话的同时进行第二次通话

  • 在讨论实现之前,让我们解释一下该函数的作用:它不会对整个数组
    A
    进行排序,而只对其初始
    n
    元素进行排序。您可以将数组的长度传递给
    n
    ,以对整个内容进行排序,但是单独传递长度对于理解答案的其余部分至关重要

    我不明白如果
    n>1
    ,为什么我们必须再次调用该函数

    解释此条件含义的更好方法可能是,当
    n
    为1或更小时,我们不再调用此函数。这被称为递归算法的基本情况,即不需要做任何事情的情况。在排序的情况下,这意味着只有一个元素的数组已经被排序

    当我们再次调用函数时,为什么要输入
    (n-1)

    因为
    n
    是我们需要排序的元素数,所以我们传递
    n-1
    对数组的前面进行排序。函数返回后,我们知道部分
    A[1..n-1]
    已经排序。我们所需要做的就是将
    A[n]
    移动到正确的位置。我们在下面的
    DOWHILE
    循环中这样做:我们一次向后移动一个元素,将大于
    a[n]
    的元素向右移动。循环结束后,我们将
    A[n]
    放置到它的新位置。现在范围
    A[1..n]
    已排序

    递归在一般情况下是如何工作的

    该函数有两种情况——基本情况(当一切都完成时)和简化步骤(当您使用递归调用来解决更简单的问题,然后使用更简单解决方案的结果来构造最终解决方案时)

    一旦我们再次调用该函数,我们是否会忽略第4行之后的代码,直接跳转到第二个调用


    不,一旦函数返回,我们将继续我们离开的地方。在您的情况下,函数将等待对
    A[1..n-1]
    范围进行排序,然后再将
    A[n]
    放置到正确的位置。

    了解其工作原理的小示例:

    recursive_insertion_sort([1, 7, 5, 2], 4)
        | recursive_insertion_sort([1, 7, 5, 2], 3)
        |    | recursive_insertion_sort([1, 7, 5, 2], 2)
        |    |    | recursive_insertion_sort([1, 7, 5, 2], 1) 
        |    | puts 7 in the right position between it's ORDERED left values [1] -> [1,7]
        | puts 5 in the right position between it's ORDERED left values [1,7] -> [1,5,7]
    puts 2 in the right position between it's ORDERED left values [1,5,7] -> [1,2,5,7]
    

    我懂了。这样写确实有助于我更清楚地理解它。谢谢:)不客气,写呼叫树来理解递归对我来说总是很有帮助的谢谢你花时间来帮助我并回答我所有的问题-我知道我问了很多可能是基本的问题,但我真的很困惑哈哈。我现在能够理解算法&递归。非常感谢!:)