0

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() 関数を変更して、残りの並べ替えと同じ実装にする方法について、いくつかのアイデアを教えてください。

ありがとうございました!

4

2 に答える 2

0

mSortとメソッドが正しいとすれば、mergeこれはどうですか?

public void mergeSort()
{ // start of mergeSort.
    SortDoubleArray result = mSort(this);
    clear();
    addAll(result);
} // End of mergeSort.

テストの関連する行は次のようになります。

    list.mergeSort();

幸運を!

于 2013-02-21T23:57:37.173 に答える
0

現在、関数mergeSort()merge()関数はそれぞれ新しいSortedDoubleArrayオブジェクトを作成しています。理想的には、新しい配列を作成せずにすべてをその場で行うことです。作成とコピーの量が多いほど、アルゴリズムのパフォーマンスが大幅に低下します。

したがって、メソッドには次のようなプロトタイプがあります。

private SortDoubleArray mSort(SortDoubleArray list, int startIndex, int length)

private SortDoubleArray merge(SortDoubleArray list, 
                              int leftIndex, int leftlength,
                              int rightIndex, int rightlength)

次に、ArrayList.setand.getを一時変数とともに使用して、その場でスワッピングを行います。これは、単一のアレイのみで作業し、新しい不要なアレイを作成しないことを意味します。

これは役に立ちますか?私が問題を理解した場合、またはさらに説明が必要な場合はお知らせください。

int endIndexの代わりにも機能することに注意してくださいint length

于 2013-02-22T00:01:13.260 に答える