Javaソートアルゴリズムの概要(IV):シェルソート

Javaソートアルゴリズムの概要(IV):シェルソート

シェルソート(縮小増分法)は挿入型ソートに属し、順序付けられていないシーケンス全体をいくつかの小さなサブシーケンスに分割し、それらを個別に挿入してソートします。シェルソートは安定しておらず、追加スペースは O(1)、時間計算量は O(N*(logN)^2) です。最悪の場合の実行効率は、平均的な場合の実行効率とそれほど変わりません。

基本的な考え方:

まず、最初の増分として n より小さい整数 d1 を取り、ファイル内のすべてのレコードを d1 グループに分割します。距離が d1 の倍数であるすべてのレコードは同じグループに配置されます。まず、各グループ内で直接挿入ソートを実行します。次に、2 番目の増分 d2<d1 を取り、増分 dt=1 (dt<dt-l<…<d2<d1) になるまで、つまりすべてのレコードが同じグループに配置されて直接挿入ソートが実行されるまで、上記のグループ化とソートを繰り返します。

コード実装:

  1. パブリッククラステスト{
  2. public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // プリセットデータ配列
  3. パブリック静的void main(String args[]) {
  4. int i; // ループカウント変数
  5. int Index = a .length; // データインデックス変数
  6. System.out.print("ソート前: ");
  7. ( i = 0 ; i &lt;の場合 インデックス- 1; i++)
  8. System.out.printf("%3s ", a);
  9. System.out.println("");
  10. ShellSort(Index - 1); // ソートを選択
  11. // ソートされた結果
  12. System.out.print("ソート後: ");
  13. ( i = 0 ; i &lt;の場合 インデックス- 1; i++)
  14. System.out.printf("%3s ", a);
  15. System.out.println("");
  16. }
  17. パブリック静的void ShellSort(int Index) {
  18. int i, j, k; // ループカウント変数
  19. int Temp; // 一時変数
  20. boolean Change; // データが変更されたかどうか
  21. int DataLength; // コレクションを分割する間隔の長さ
  22. int ポインタ; // 処理する場所
  23. DataLength = (int) Index / 2; // 初期収集間隔の長さ
  24. while (DataLength != 0) // シーケンスはまだ分割できます
  25. {
  26. // 各コレクションを処理する
  27. for ( j = DataLength ; j &lt;  インデックス; j++) {
  28. 変更= false ;
  29. Temp = a [j]; // 後で使用するためにData[j]の値を一時的に保存します
  30. Pointer = j - DataLength; // 処理する位置を計算する
  31. // コレクション内の値を比較して交換する
  32. (Temp &lt;の間、   a [ポインタ] && ポインタ> = 0 && ポインタ< = インデックス) {
  33. a[ポインタ + データ長] = a[ポインタ];
  34. // 次に処理する位置を計算する
  35. ポインタポインタ= ポインタ - データ長;
  36. 変更= true ;
  37. if (ポインタ&lt;   0 || ポインタ>インデックス)
  38. 壊す;
  39. }
  40. // 最後の値と交換
  41. a[ポインタ + データ長] = Temp;
  42. if (変更) {
  43. // 現在のソート結果を出力します
  44. System.out.print("ソート: ");
  45. ( k = 0 ; k &lt; )の場合 インデックス; k++)
  46. System.out.printf("%3s ", a[k]);
  47. System.out.println("");
  48. }
  49. }
  50. DataLength DataLength = DataLength / 2; // 次のセグメンテーションの間隔の長さを計算します
  51. }
  52. }
  53. }

シェルソートでは、最悪のシナリオはほとんどありません。順方向、逆方向、ランダムな順序のいずれであっても、かかる時間はそれほど長くなく、追加のストレージは O(1) であり、これは非常に優れています。クイックソートとヒープソートを理解する前に、それは確かに良い選択です。これがお役に立てば幸いです。

【編集者のおすすめ】

  1. Java オブジェクト インスタンスはいつ作成されますか?
  2. C++ ソートに関する 4 つの古典的な講義: シェル ソート
  3. Java Web アプリケーション開発におけるいくつかの概念の解釈

<<:  Java ソートアルゴリズムの概要 (V): マージソート

>>:  Java ソートアルゴリズムの概要 (パート 3): バブル ソート

推薦する

JVMの基本的なガベージコレクションアルゴリズムについて

この記事は JavaEye ブログからの引用であり、元のタイトルは「JVM チューニングの概要 (パ...

ディープラーニングで知っておくべき活性化関数トップ10

みなさんこんにちは、ピーターです〜最近、reddit で非常に鮮明な mó xìng の写真を見まし...

DeepMindの強化学習法はAIと人間のより良いコラボレーションを約束する

[[437442]] [51CTO.com クイック翻訳]囲碁からスタークラフト、Dotaまで、多く...

Googleが小規模でGeminiのテストを開始したと報道:GPT-4のトレーニングよりも5倍強力で、マルチモーダル機能が大幅に向上

今年5月のGoogle I/Oカンファレンスで、ピチャイ氏はGPT-4と競合する大規模モデルであるP...

チップ設計の極めて高いハードルがAIによって「打ち破られる」

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

マーケターがAIと機械学習を活用して顧客にリーチする方法

数十年前、技術者が初めて人工知能の概念を生み出したとき、彼らは人間の知能を模倣できる技術を生み出そう...

2021年最新Contrastive Learning(対照学習)主要会議での必読古典論文解釈

みなさんこんにちは。私はDiaobaiです。最近、対照学習が流行っているので、ICLR2020では、...

...

コストを70%削減する秘訣: これらの企業はAIをコスト効率よく活用する方法を見つけました

過去 6 か月間で、ChatGPT によってもたらされた AI の人気は誰もが直感的に感じることがで...

...

必要なのはこれら3つの機械学習ツールだけです

多くの機械学習技術は、急速に概念実証から人々が日常的に頼りにする重要なテクノロジーの基盤へと移行して...

機械学習を使用して暗号プロジェクトのリスクを特定するにはどうすればよいでしょうか?

暗号通貨と規制の必要性暗号通貨は、デジタル世界に存在する交換手段(別の支払い形式)であり、取引を安全...

ボストン・ダイナミクスの二足歩行ロボット「アトラス」が驚異的な体操ショーを披露、ネットユーザー「恐ろしい」

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

AI開発者のための7つの倫理ガイドライン

人工知能はここ数年で大きな進歩を遂げました。 AIテクノロジーで生み出されるソリューションは想像を絶...

図解機械学習: 誰でも理解できるアルゴリズムの原理

機械学習の話題は誰もが話題にするほど普及していますが、それを完全に理解している人はほとんどいません。...