基本的なプログラミングアルゴリズムを簡単にマスターする(パート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)

ブログ    

推薦する

いくつかの小さな図でディープラーニングを徹底的に説明します

Andrew Ng 氏は、Tess Ferrandez 氏が修了したディープラーニング特別コースのイ...

ナレッジグラフとディープラーニングが「出会う」とき

著者: Xiao Yanghua、復旦大学コンピュータ科学技術学院准教授、博士課程指導教員、上海イン...

将来の不動産価格決定はAIが最終決定する

一部の企業にとって、新型コロナウイルス感染症のパンデミックは壊滅的な打撃となっている。しかし、他の企...

ソフトマックスを放棄した初の大規模線形アテンショントランスフォーマーモデル: 1750億のパラメータ、より優れた速度と精度

最近、上海人工知能研究所とOpenNLPLabの研究チームが、ソフトマックスベースの注意メカニズムを...

...

...

役に立つ情報: GitHub で 26,000 個のスターを獲得!初心者のための Python アルゴリズム

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

...

OpenAI エンジニア必読: 苦い教訓

OpenAIが動画生成モデルSoraをリリースしてから1週間が経ちましたが、その人気は衰えていません...

業界の資金調達が活発化しています!自動運転技術は物流分野で初めて導入される可能性

2019年、自動運転分野は谷間に向かうかに見えましたが、わずか数か月で業界は徐々に再び熱を帯び始め、...

モバイルアプリ開発における人工知能の実装

[[382351]] [51CTO.com クイック翻訳] 人々が今日のニーズについて話すとき、彼ら...

NeRFは過去のものになるのか?立体復元は3D GSの新時代へ! (復旦大学からの最新レビュー)

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

...

インテルと4Paradigmが協力し、誰もがAIを利用できるように

[51CTO.com からのオリジナル記事] 今日、人工知能はもはや遠い概念ではなく、私たちの仕事と...