【问题标题】:program stuck at the end of recursion in (recursive)insertion sort程序卡在(递归)插入排序中的递归末尾
【发布时间】:2020-04-22 12:48:43
【问题描述】:

我正在尝试在 C++ 中递归地实现插入排序。

#include <iostream>
#include <vector>
using namespace std;

vector<int> insertionSort(vector<int>& A,int p,int r)
{ 
    for(auto x=p;x<=r;++x) cout<<A[x]<<' ';
    cout<<endl;  
    if(p<r-1) insertionSort(A,p,r-1);
    cout<<"flag";
    int key=A[r];
    int i=r-1;
    while(i>p)
    {
        if(key<=A[i])
        {
            A[i+1]=A[i];
            i=i-1;
        }
        A[i+1]=key;
    }
    return A;
}

int main()
{
    vector<int> A {22,2,31,41,59,90,11,26,41,58};
    insertionSort(A,0,A.size()-1);
    for(auto x:A) cout<<x<<' ';
    cout<<endl;
}

输出:

22 2 31 41 59 90 11 26 41 58
22 2 31 41 59 90 11 26 41
22 2 31 41 59 90 11 26
22 2 31 41 59 90 11
22 2 31 41 59 90
22 2 31 41 59
22 2 31 41
22 2 31
22 2
^C⏎

你可以看到它在递归结束时卡住了(它没有超过 flag 语句),我必须手动退出执行。如果我的理解是正确的,那么当递归结束时,下一个语句将在每个调用堆栈中执行。请帮我找出问题所在。任何帮助将不胜感激。

【问题讨论】:

  • 从一个较小的向量开始,然后使用调试器逐语句逐句执行代码,同时监控变量及其值。请注意,将语句放在不同的行会有所帮助。
  • 在 while 循环键中 > A[i] 导致无限循环,因为 i 从不改变。
  • 由于缓冲,您可能看不到“标志”。试试cout &lt;&lt; "flag" &lt;&lt; flush;
  • 调试器!调试器!调试器!!!
  • 那么这是学习的好时机。祝你好运!

标签: c++ recursion insertion-sort


【解决方案1】:

感谢大家对 cme​​ts 的帮助。就像他们说的那样,由于if 块未执行时发生的无限循环,程序似乎被卡住了。所以我添加了一个break 并将插入语句放在while 块之外。这是更正后的代码:

vector<int> insertionSort(vector<int>& A,int p,int r)
{   
    if(p<r-1) insertionSort(A,p,r-1);
    int key=A[r];
    int i=r-1;
    while(i>=p)
    {
        if(key<A[i])
        {
            A[i+1]=A[i];
            i=i-1;
        }
        else break;
    }
    A[i+1]=key;
    return A;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2015-07-07
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多