C:自上而下合并排序 - 为什么无限递归?

时间:2016-09-24 11:53:37

标签: c arrays sorting recursion mergesort

我试图实现合并排序,其中原始和辅助数组交替进行每次递归。 It's based on a this Java code。描述如下(Link):

  

改进。我们可以通过一些经过仔细考虑的实施修改来缩短mergesort的运行时间。

     

[...]

     
      
  • 消除副本到辅助阵列。可以消除复制到用于合并的辅助阵列所花费的时间(但不是空间)。为此,我们使用sort方法的两个调用,一个从给定数组获取其输入并将排序后的输出放入辅助数组中;另一个从辅助数组中获取输入,并将排序后的输出放入给定数组中。通过这种方法,我们可以通过递归调用来安排递归调用,以便计算在每个级别切换输入数组和辅助数组的角色。
  •   

以下C代码是我尝试替换两个数组的角色:

      public class MainActivity extends Activity implements OnClickListener {
            private SzabadEuMusorok[] mSzabadEuMusoroks;

            @InjectView(R.id.archivumReyclerView)
            RecyclerView mRecyclerView;
            RecyclerView.LayoutManager layoutManager ;
            @Override
            protected void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_archivum);
                ButterKnife.inject(this);

                setArray();


                layoutManager = new LinearLayoutManager(this);

      new LongOperation().execute("");//call your webservice
            }



                private class LongOperation extends AsyncTask<String, Void, String> {

                    @Override
                    protected String doInBackground(String... params) {
                        for (int i = 0; i < 5; i++) {
                            try {

            //call your webservice here
                            } catch (InterruptedException e) {
                                Thread.interrupted();
                            }
                        }
                        return serviceResult;// this will be passed to onPostExecute
                    }

                    @Override
                    protected void onPostExecute(String result) {
mRecyclerView.setLayoutManager(layoutManager);

                mRecyclerView.setHasFixedSize(true);
                   CollectionsAdapter adapter = new CollectionsAdapter(this, mSzabadEuMusoroks);
            mRecyclerView.setAdapter(adapter);   //set your adapter using result in webservice called in doinbackground
                    }

                    @Override
                    protected void onPreExecute() {
            // show a progress dialog 

            }

                }
            }

使用valgrind进行分析后,似乎我的代码进行了无限递归(消息是&#34;无法增长堆栈&#34;)。

为什么我的实现会进行无限递归?

1 个答案:

答案 0 :(得分:0)

也许,valgrind不能通过递归判断 元素 减少与否。
请尝试以下代码。

static void sort(char *a, char *b, size_t n) {
        :
        :
    //========== SPLIT OPERATION ==========//

    size_t  m = n/2;
    sort(b, a, m);
    sort(b + m * size_m, a + m * size_m, n - m);