我试图实现合并排序,其中原始和辅助数组交替进行每次递归。 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;)。
为什么我的实现会进行无限递归?
答案 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);