ArrayList を拡張するソート可能な ArrayLists のクラスを構築しています。目標は、SortDoubleArray で並べ替えメソッドを呼び出し、説明したメソッドを介してその配列を並べ替えることができるようにすることです。クイックソート、挿入ソート、バブルソート、選択ソートはすべて思い通りに動作しました。ただし、マージソートには問題があります。
並べ替えは機能しますが、関連する再帰が機能しているため、リストの内容をそれ自体に適用されるメソッドにリセットする必要があります。
まず、ここにテスタークラスがあります。他の種類がどのように実装されているかを示しています。私の問題をうまく説明できなかったとしても、mergeSort() メソッドの使用方法の違いがわかると思います。
public class SortTester
{
/**
* @param args
*/
public static void main(String[] args)
{
SortDoubleArray list = new SortDoubleArray();
// Code to fill an array with random values.
//list.quickSort();
//list.insertionSort();
//list.selectionSort();
//list.bubbleSort();
list = list.mergeSort();
// Code to print the sorted array.
}
}
次に、SortDoubleArray クラスです。簡潔にするために、insertSort (私が望むように動作する例として役立つ) 以外のすべての並べ替えは削除されています。
public class SortDoubleArray extends ArrayList<Double>
{ // Start of class.
private static final long serialVersionUID = 1271821028912510404L;
/**
* Progresses through the elements one at a time inserting them in their proper place
* via swaps.
*/
public void insertionSort()
{ // Start of insertionSort.
int current = 1;
while (current < size())
{
int i = current;
boolean placeFound = false;
while(i > 0 && !placeFound)
{
if (get(i) < get(i - 1))
{
double temp = get(i);
set(i, get(i - 1));
set(i - 1, temp);
i -= 1;
}
else
{
placeFound = true;
}
}
current += 1;
}
} // End of insertionSort.
/**
* Triggers the recursive mSort method.
* @return
*/
public SortDoubleArray mergeSort()
{ // start of mergeSort.
return mSort(this);
} // End of mergeSort.
/**
* Separates the values each into their own array.
*/
private SortDoubleArray mSort(SortDoubleArray list)
{ // Start of mSort.
if (list.size() <= 1)
{
return list;
}
SortDoubleArray left = new SortDoubleArray();
SortDoubleArray right = new SortDoubleArray();
int middle = list.size() / 2;
for (int i = 0; i < middle; i += 1)
{
left.add(list.get(i));
}
for (int j = middle; j < list.size(); j += 1)
{
right.add(list.get(j));
}
left = mSort(left);
right = mSort(right);
return merge(left, right);
} // End of mSort.
/**
* Merges the separated values back together in order.
*/
private SortDoubleArray merge(SortDoubleArray left, SortDoubleArray right)
{ // Start of merge.
SortDoubleArray result = new SortDoubleArray();
while (left.size() > 0 || right.size() > 0)
{
if (left.size() > 0 && right.size() > 0)
{
if (left.get(0) <= right.get(0))
{
result.add(left.get(0));
left.remove(0);
}
else
{
result.add(right.get(0));
right.remove(0);
}
}
else if (left.size() > 0)
{
result.add(left.get(0));
left.remove(0);
}
else if (right.size() > 0)
{
result.add(right.get(0));
right.remove(0);
}
}
return result;
} // End of merge.
} // End of class.
SortDoubleArray クラス内の mergeSort() / mSort() 関数を変更して、残りの並べ替えと同じ実装にする方法について、いくつかのアイデアを教えてください。
ありがとうございました!