より良いアプローチをマージするための配列の配列を指定して、マージソートアルゴリズムを実装しようとするとします。これは次のとおりです。
public void merge(ArrayList<ArrayList<E>> a) {
ArrayList<ArrayList<E>> tmp = new ArrayList<ArrayList<E>>() ;
while (a.size()>1) {
for (int i=1; i<a.size();i+=2) {
tmp.add(merge(a.get(i-1),a.get(i)));
}
if (a.size()%2==1) tmp.add(a.get(a.size()-1));
a = tmp;
tmp = new ArrayList<ArrayList<E>>() ;
}
}
またはこれ:
public void merge(ArrayList<ArrayList<E>> a) {
ArrayList<ArrayList<E>> tmp = new ArrayList<ArrayList<E>>(),tmp2 ;
while (a.size()>1) {
for (int i=1; i<a.size();i+=2) {
tmp.add(merge(a.get(i-1),a.get(i)));
}
if (a.size()%2==1) tmp.add(a.get(a.size()-1));
tmp2 = a;
a = tmp;
tmp = tmp2;
tmp.clear();
}
}
より明確にするために、私が行っていたのは、aの各カップルのネイバーをマージし、結果のマージされた配列を配列の外部配列tmpに配置することです。すべてのカップルをマージした後、1 つのアプローチは a をクリアしてからtmpをaに移動することです次に、クリアされた aをtmpに移動します。 2 番目のアプローチは、古い tmpを再利用する代わりに、古いtmpを「スロー」して新しいtmpを取得することです。