基本的なプログラミングアルゴリズムを簡単にマスターする(パート3)

基本的なプログラミングアルゴリズムを簡単にマスターする(パート3)

[[121972]]

基本的なプログラミングアルゴリズム(I)

基本的なプログラミングアルゴリズム(II)

基本的なプログラミングアルゴリズム(III)

選択ソート

使用条件: 同等のサイズのコレクション。

アルゴリズムのアイデア: 毎回、ソートするデータ要素から最小 (または最大) の要素を選択し、ソートするすべてのデータ要素がソートされるまで、ソートされたシーケンスの最後に配置します。

プログラミング例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}

  1. //単純な選択ソート 
  2. voidシンプルセレクト( int b[10])
  3. {
  4. 整数温度;
  5. 整数i;
  6. (i=0;i<9;i++)の場合
  7. {
  8. ( int j=i+1;j<9;j++)の場合
  9. {
  10. もし(b[i]>b[j])
  11. {
  12. temp = b [i];
  13. b[i] = b[j];
  14. b[j] = 一時;
  15. }
  16. }
  17. }
  18. cout<< "ソートは次のようになります:" ;
  19. ( int i=0;i<10;i++ )の場合
  20. {
  21. cout<<b[i]<< " " ;
  22. }
  23. cout<<endl;
  24. }

パフォーマンス分析: 時間計算量は O(n^2)

ヒープソート

使用条件: 同等のサイズのコレクション。

アルゴリズムのアイデア: 実際、ヒープ ソートは単純な選択ソートの進化形であり、その主な機能は比較回数を減らすことです。ヒープとは何ですか?シーケンスを完全な二分木と見なすと、完全な二分木内のすべての非終端ノードの値は、その左と右の子ノードの値よりも大きくありません(または小さくありません)。これをヒープと呼ぶことができます。ヒープの特性から、ヒープの最上部が最大キーワード (または最小キーワード) であることがわかります。ヒープの最上部を出力した後、残りの要素で別のヒープを構築し、最上部を出力します。この処理を繰り返し実行することで、順序付けられたシーケンスを取得できます。この処理はヒープソートと呼ばれます。

ヒープソートは主に 2 つのステップに分かれます。

(1)順序付けられていないシーケンスからヒープを構築する。

(2)最上位の要素を出力し、新たなヒープを形成する。

プログラミング例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}

  1. //ヒープソート 
  2. voidヒープソート( int b[10])
  3. {
  4. voidヒープ調整( int b[10], int min, int max);
  5. void Sawp( int *a, int *b);
  6. 整数i;
  7. //バイナリツリーが完成しているので、ヒープ変換は最後の非リーフノードから開始されます 
  8. (i=9/2;i>=0;i--)の場合
  9. {
  10. ヒープ調整(b,i,9);
  11. }
  12. //ヒープの一番上のデータを取り出して再度ソートする 
  13. (i=9;i>0;i--)の場合
  14. {
  15. sawp(&b[i],&b[0]);
  16. ヒープ調整(b,0,i-1);
  17. }
  18. }
  19.  
  20. //ヒープ調整(トップヒープが大きい)  
  21. //最小データは配列の開始位置を調整する必要がある 
  22. //最大データはデータの終了位置を調整する必要がある 
  23. voidヒープ調整( int b[10], int最小値, int最大値)
  24. {
  25. (max<=min)の場合戻り値は;
  26. 整数温度;
  27. 温度=b[分];
  28. 整数j;
  29.      
  30. // 子ノードのループを拡張する 
  31. (j=2*最小;j<=最大;j*=2)の場合
  32. {
  33. //古い子を選択 
  34. (j<max&&b[j]<b[j+1])の場合
  35. {
  36. j++;
  37. }
  38.          
  39. // ヒープの先頭より大きい子は処理されません 
  40. (temp>b[j])の場合
  41. {
  42. 壊す;
  43. }
  44.          
  45. //大きい数字を小さい数字に置き換える 
  46. b[最小] = b[j];
  47. 最小値=j;
  48. }
  49. b[分]=温度;
  50. }
  51.  
  52. //スワップ関数 
  53. void Sawp( int *a, int *b)
  54. {
  55. 整数温度;
  56. 温度=*a;
  57. *a=*b;
  58. *b=一時;
  59. }

パフォーマンス分析: 時間計算量 時間計算量 O(nlogn)

マージアルゴリズム

2ウェイマージアルゴリズムとも呼ばれる

使用条件: 同等のサイズのコレクション。

アルゴリズムのアイデア: 初期シーケンスに n 個のレコードが含まれていると仮定すると、これは n 個の順序付けられたサブシーケンスと見なすことができます。各サブシーケンスの長さは 1 で、次に 2 つずつ結合して、長さが 2 または 1 の [n/2] 個のサブシーケンスを取得します (ここでは長さが 1 で、シーケンスの長さが奇数の場合は最後のシーケンスがそのまま残されるため、長さは 1 になります)。次に 2 つずつ結合し、長さ n の順序付けられたシーケンスが得られるまでこのプロセスを繰り返します。

プログラミング例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}

  1. //マージソート 
  2. voidマージソート( int b[10], int d[10], int min, int max)
  3. {
  4. //中央の領域から取得したシーケンスを使用して保存します 
  5. 整数c[10];
  6. void Merge( int c[10], int d[10], int min, int mid, int max);
  7. (min==max)d[min]=b[min]の場合;
  8. それ以外 
  9. {
  10. // 2つの領域に分割する 
  11. int中間 = (最小 + 最大) / 2;
  12. //このエリアをマージしてソートする 
  13. マージソート(b,c,min,mid);
  14. //このエリアをマージしてソートする 
  15. マージソート(b,c,mid+1,max);
  16. // 2つの領域を結合する 
  17. マージ(c,d,最小,中間,最大);
  18. }
  19. }
  20.  
  21. //順序付けられたシーケンス d[min-mid] と d[mid+1-max] を順序付けられたシーケンス c[min-max] にマージします。  
  22. void Merge( int c[10], int d[10], int min, int mid, int max) をマージします。
  23. {
  24. 整数i,j,k;
  25. (i=j=min,k=mid+1;j<=mid&&k<=max;i++)の場合
  26. {
  27. (c[j]>c[k])の場合
  28. {
  29. d[i] = c[k];
  30. 関数
  31. }
  32. それ以外 
  33. {
  34. d[i] = c[j];
  35. j++;
  36. }
  37. }
  38. (j<=mid)の場合
  39. {
  40. (;j<=mid;j++,i++)の場合
  41. {
  42. d[i] = c[j];
  43. }
  44. }
  45. (k<=max)の場合
  46. {
  47. (;k<=max;k++,i++)の場合
  48. {
  49. d[i] = c[k];
  50. }
  51. }
  52. }

パフォーマンス分析: 時間計算量 O(nlogn)

要約する

では、ソートアルゴリズムは数多くありますが、どのアルゴリズムをいつ使用すればよいのでしょうか?

さまざまなアプリケーションや要件に応じて適切なソート方法が異なるため、次の要素を考慮して適切なソート方法を選択してください。

  • ソートするレコードの数 n

  • 安定性の要件

  • ストレージ構造

  • 時間と補助空間の複雑さ

(1)nが比較的小さい場合(例えばn <= 50)、直接挿入ソートまたは単純選択ソートを使用することができる。

(2)シーケンスの初期状態が基本的に順序付けられている場合は、直接挿入ソートまたはバブルソートを選択できます。

(3)nが比較的大きい場合は、時間計算量がO(nlogn)のアルゴリズム(クイックソート、ヒープソート、マージソート)を使用することができる。

クイックソートは現在、比較ベースの内部ソートに最適な方法と考えられています。ソートされたキーワードがランダムに分散されている場合、クイックソートの平均時間は最短になります。 不安定

ヒープ ソートでは、クイック ソートよりも補助スペースが少なくて済み、クイック ソートで発生する可能性のある最悪のシナリオの影響を受けません。 しかし、まだ比較的不安定

マージソートは比較的安定していますが、一般的に使用することは推奨されません。実用性が低く、大量の補助スペースを占有する可能性があります。

<<:  距離ベクトルルーティングアルゴリズムの仕組みを説明する

>>:  基本的なプログラミングアルゴリズムを簡単にマスターする(パート2)

ブログ    
ブログ    

推薦する

...

...

OpenLLMを使用して大規模なモデルアプリケーションを構築および展開する

この共有のテーマは、「OpenLLM を使用して大規模な言語モデル アプリケーションを迅速に構築およ...

AIコンテンツゼロ!純粋なランダム数学は現実的な3D世界を無限に生成する、プリンストン大学の中国人による研究

画像や動画の生成には AI に頼らなければならないと誰が言ったのでしょうか?プリンストン大学の新しい...

変革のトレンド: ジェネレーティブ AI とソフトウェア開発への影響

人工知能の出現により、ソフトウェア開発の継続的な発展が加速しています。この強力なテクノロジーは、ソフ...

よりスマートに:人工知能とエネルギー産業の革命

人工知能は私たちの生活、仕事、遊び方に革命をもたらそうとしているが、Amazon の Alexa や...

...

AIテスト:自動運転車のテストに関するケーススタディ

編集者注:最近、清華大学自動化学部システム工学研究所の李立准教授を筆頭著者として、林一倫、鄭南寧、王...

AI軍拡競争により、将来のAIハードウェアアーキテクチャの開発に3つの主要な方向性が生まれました。

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

MWC2018が開催間近、人工知能が焦点に

人工知能はバブルを抜け出し、徐々に細分化された分野に入り込み、繁栄し始めており、近年ではCESやMW...

...

Pudu Technology が「2021 年最も革新的な中国のケータリング ブランド トップ 100」に選出されました

最近、ケータリングボスインサイダーが主催する「Upward 2021・第6回中国ケータリングイノベー...

機械学習の基礎知識がゼロでも、TensorFlow で画像認識システムを構築する方法をお教えします (パート 2)

[[182024]]これは Wolfgang Beyer によるブログ投稿です。この論文では、Te...

...

...