Java データ構造ソート アルゴリズム (1) ツリー選択ソート
この記事では、Java データ構造ソート アルゴリズムのツリー 選択ソート を主に紹介し、具体的な例に基づいて Java ツリー選択ソートの原理、実装テクニック、および関連する注意事項を分析します。例では、Java データ構造のツリー選択ソート アルゴリズムを説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
ここでは選択ソートの 1 つについて説明します: ツリー選択ソート
単純な選択ソートでは、各比較は前の比較を使用しません。比較演算の時間計算量は
O(N^2)です。比較の数を減らしたい場合は、比較プロセス中にサイズ関係を保存する必要があります。ツリー選択ソートは、単純な選択ソートを改良したものです。
ツリー選択ソート:は、トーナメントソート)とも呼ばれ、トーナメントの考え方に基づいた選択ソートの方法です。 最初に n 個のレコードのキーワードのペアごとの比較を実行し、次に n/2 個の小さいキーワード間のペアごとの比較を実行し、最小のレコードが選択されるまでこれを繰り返します。
アルゴリズムの実装コードは次のとおりです: package exp_sort;
public class TreeSelectSort {
public static int[] TreeSelectionSort(int[] mData) {
int TreeLong = mData.length * 4;
int MinValue = -10000;
int[] tree = new int[TreeLong]; // 树的大小
int baseSize;
int i;
int n = mData.length;
int max;
int maxIndex;
int treeSize;
baseSize = 1;
while (baseSize < n) {
baseSize *= 2;
}
treeSize = baseSize * 2 - 1;
for (i = 0; i < n; i++) {
tree[treeSize - i] = mData[i];
}
for (; i < baseSize; i++) {
tree[treeSize - i] = MinValue;
}
// 构造一棵树
for (i = treeSize; i > 1; i -= 2) {
tree[i / 2] = (tree[i] > tree[i - 1] ? tree[i] : tree[i - 1]);
}
n -= 1;
while (n != -1) {
max = tree[1];
mData[n--] = max;
maxIndex = treeSize;
while (tree[maxIndex] != max) {
maxIndex--;
}
tree[maxIndex] = MinValue;
while (maxIndex > 1) {
if (maxIndex % 2 == 0) {
tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex + 1] ? tree[maxIndex]
: tree[maxIndex + 1]);
} else {
tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex - 1] ? tree[maxIndex]
: tree[maxIndex - 1]);
}
maxIndex /= 2;
}
}
return mData;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
TreeSelectionSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println("\n");
}
}
アルゴリズム分析: ツリー選択ソートでは、最小のキーワードを除き、選択された最小のキーワードはすべて葉で区切られます。 n 個のリーフ ノードを含む完全なバイナリ ツリーの深さは log2n+1 であるため、ツリー選択の並べ替えでは、より小さいキーワードが選択されるたびに log2n の比較が必要になるため、時間は複雑度 O(nlog2n) になります。 、移動レコードの数は比較の数を超えないため、アルゴリズムの合計時間計算量は O(nlog2n) となり、単純な選択ソート アルゴリズムと比較すると、比較の数が n-1 桁減少します。追加のストレージスペースに中間比較結果が保存されます。
補足: ここでは、ツリー選択ソートの改良されたアルゴリズム、すなわち
ヒープソートアルゴリズムを紹介します。 ヒープソートは、多くのスペースを占有するツリー選択ソートアルゴリズムの欠点を補います。ヒープ・ソートを使用する場合、必要な補助スペースはレコード・サイズの 1 つだけです。
アルゴリズムの考え方は次のとおりです:ソートするレコードのキーワードを
配列r[1...n]に格納し、rを完全なバイナリツリーの逐次表現とみなします各ノードは A レコードを表し、最初のレコード r[1] がバイナリ ツリーのルートとして使用され、各レコード r[2...n] が層ごとに順番に配置されます。任意のノード r[i] の左の子は r[2*i]、右の子は r[2*i+1]、親は r[[i/2]] です。
ヒープ定義:各ノードのキー値は次の条件を満たします: r[i].key >= r[2i].key および r[i].key >= r[2i+1] ].key (i=1,2,…[i/2])
上記の条件を満たす完全なバイナリ ツリーは、逆に、この完全なバイナリ ツリー内のいずれかのノードのキーが大規模ルート ヒープと呼ばれます。左の値以下である 子および右の子のキーワードに対応するヒープは、小さなルート ヒープと呼ばれます。
ヒープのソートのプロセスでは、主に 2 つの問題を解決する必要があります。1 つ目は、ヒープ定義に従って初期ヒープを構築することです。2 つ目は、最大要素を削除して次の最大要素を取得した後にヒープを再構築することです。
ヒープのソートは、ヒープの特性を使用してレコード シーケンスをソートします。
1. ヒープの先頭を出力します。要素と最後の要素)
3. 残りの要素の再構築ヒープを実行します (最初の要素をフィルターします)4. すべての要素が出力されるまで、手順 2 と 3 を繰り返します。
注:
アルゴリズム分析:
1. 深さ k のヒープの場合、「フィルタリング」に必要なキーワード比較の数は最大 2 (k-1) です。n 個のキーワードのヒープ深さは次のとおりです。 [log2n]+1 の場合、最初にヒープを構築するために必要なキーワード比較の数は最大でも n* [log2n];3 です。ヒープを n-1 回再構築するために必要なキーワード比較の数は次を超えません: ( n-1)*2 [log2n];
したがって、ヒープソートの時間計算量は最悪の場合でも O(nlog2n) となり、これがヒープソートの最大の利点です。
【関連する推奨事項】
1.
Java での Selection Sort_java の詳細なサンプル チュートリアル2. Java データ構造ソート アルゴリズム (2) マージ ソート
3. Java データ構造ソート アルゴリズム (3)選択ソート
4. Javaデータ構造ソートアルゴリズム (4) 選択ソート
以上がJava データ構造ソート アルゴリズム (1) ツリー選択ソートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。
