4

誰かが次のコードを説明できますか?

ソース:Arrays.class、

public static <T> void sort(T[] a, Comparator<? super T> c) {
T[] aux = (T[])a.clone();
    if (c==null)
        mergeSort(aux, a, 0, a.length, 0);
    else
        mergeSort(aux, a, 0, a.length, 0, c);
}
  1. なぜAuxを作成するのですか?
  2. コードがAuxをソートする場合、ソートはどのように機能しますか?
  3. これは、ソートする前にアレイのクローンを作成するためのリソースの無駄ではありませんか?
4

3 に答える 3

2

mergeSortソースを読んでください。

srcこれは、2つのパラメーター(および)を使用した非インプレースソートdestです。
パラメータをソートし、参照用destにパラメータを使用しsrcます。

于 2010-11-16T01:22:24.513 に答える
2

1:なぜAuxを作成するのですか?

このmergeSortメソッドにはソース配列と宛先配列が必要なためです。

2:コードがAuxをソートする場合、ソートはどのように機能しますか?

メソッドはからmergeSortにソートされるため aux a

3:これは、ソートする前にアレイのクローンを作成するためのリソースの無駄ではありませんか?

いいえ、そうではありません...その実装を使用していますmergeSort。ソートされた配列が返された場合、sort(空の配列を作成するのではなく)クローンを作成するのは無駄になります。ただし、APIではインプレースソートを実行する必要があります。これは、それaが「宛先」である必要があることを意味します。したがって、要素は「ソース」となる一時配列にコピーする必要があります。

このmergeSortメソッドを見ると、ソートする配列を再帰的に分割し、ソース配列と宛先配列の間で前後にマージしていることがわかります。これを機能させるには、2つのアレイが必要です。おそらく、Sun / Oracleは、このアルゴリズムが典型的なJavaソートのユースケースに優れたパフォーマンスをもたらすと判断しました。

于 2010-11-16T01:30:08.250 に答える
0

そのソースファイルを下にスクロールして、再帰的なmergeSortがどのように機能するかを確認します。ここの投稿で説明しようとするのは少し複雑すぎると思うので、ここに良い参考資料があります:

http://en.wikipedia.org/wiki/Merge_sort

于 2010-11-16T01:30:56.067 に答える