[解決済み] Java の Arrays.sort メソッドは、なぜ型によって2つの異なるソートアルゴリズムを使用するのですか?
2022-05-17 13:31:38
疑問点
Java 6の
Arrays.sort
メソッドでは、プリミティブの配列にはクイックソートを、オブジェクトの配列にはマージソートを使用します。私は、ほとんどの場合、Quicksort は merge sort よりも高速で、メモリコストも少ないと考えています。私の実験もそれを裏付けています。しかし、どちらのアルゴリズムも O(n log(n)) です。では、なぜ異なる型に対して異なるアルゴリズムが使用されるのでしょうか?
どのように解決するのか?
最も可能性の高い理由: クイックソートが 安定していない すなわち、等しいエントリはソートの間にそれらの相対的な位置を変更することができます。とりわけ、これはすでにソートされた配列をソートする場合、それが変更されないかもしれないことを意味します。
プリミティブ型は同一性を持たないので(同じ値を持つ2つのintを区別する方法がない)、これはそれらのために重要ではありません。しかし、参照型については、いくつかのアプリケーションで問題を引き起こす可能性があります。したがって、安定したマージソートがそれらに使用されます。
原始的な型に対して (保証された n*log(n)) 安定したマージソートを使用しない理由は、配列のクローンを作成する必要があるからかもしれません。参照型では、参照されるオブジェクトは通常、参照の配列よりもはるかに多くのメモリを消費するため、これは一般的には問題ではありません。しかし、プリミティブ型では、配列のクローンを作成すると、メモリ使用量が2倍になります。
関連
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
SpringBootApplication を型解決できない。
-
javaで非静的な解を静的な参照にすることができない
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
IDEA パッケージステートメントの欠落
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Java の String の hashCode() では、なぜ 31 が乗数として使われるのですか?
-
[解決済み】古典的なソートアルゴリズムを最新のC++で実装する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
Dateが型に解決できない問題を解決する
-
Javaクラスローダーにソースコードから潜り込む
-
javaの模造品QQ WeChatのチャットルーム
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
java 例外。Javaツールの初期化
-
IDEA パッケージステートメントの欠落
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)