有人可以解释递归插入排序的工作原理吗?

时间:2015-05-05 12:38:14

标签: 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
        ENDDO
        A[i+1] = temp
    ENDIF
END

在这种情况下,有人可以解释递归是如何工作的吗?有几点我不明白:

  1. 我不明白为什么如果n>我们必须再次调用该函数1.
  2. 为什么我们再次调用函数时输入(n-1)?是这样我们从n = 2开始整个过程​​,前2个元素?
  3. 一般如何递归递归?就像,一旦我们再次调用该函数,我们是否会忽略第4行以后的代码,并直接跳转到第二个调用?或者我们是否与第一个电话一起运行第二个电话?

2 个答案:

答案 0 :(得分:6)

在讨论实现之前,让我们解释一下这个函数的用途:它不会对整个数组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]范围进行排序。

答案 1 :(得分:3)

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.actualite);

    // Initializing
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    button_popup_actu = (Button) findViewById(R.id.show_list_news);

    button_popup_actu.setOnClickListener(new View.OnClickListener() {

         @Override
         public void onClick(View v) {
             PopupMenu popup = new PopupMenu(News.this, button_popup_actu);
             popup.getMenuInflater().inflate(R.menu.popup_menu_news, popup.getMenu());
             popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                 public boolean onMenuItemClick(MenuItem item) {
                     Toast.makeText(News.this, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();
                     return true;
                 }
             });
             popup.show();
         }
     });
}