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

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

[[121970]]

この記事を書く前に、プログラマーの基本的な知識についてお話ししたいと思います。多くの人が自分の仕事の経験について話したり、卒業生にアドバイスをしたりしています。学生は学校でしっかりとしたコンピューターの基礎を築くべきだという彼らの提案に、著者は同意します。しっかりした基礎がなければ、どうやって建物を建てることができるでしょうか?ある程度の基礎知識があれば、深い理論を学ぶのは2倍簡単になります。最初に深い理論に触れてから関連する基礎を学べば、労力は半分で結果は2倍になります。おそらく多くの学生は、今はすぐにでも仕事を始められる人材を採用する企業が多いと言うでしょう。著者がまず言いたいのは、そのような企業は近視眼的な小さな企業に違いないということです。採用しても、非常に優秀な人材を見つけることはできません。たとえそこに行ったとしても、そのような人材は長く留まらないでしょう。なぜなら、そのような企業には発展のビジョンがなく、技術系の人材は発展の見込みがないため転職してしまう可能性があるからです。次に、コンピュータの基礎知識がしっかりしていれば、3 か月以内に会社の技術要件を満たすように学習し、適応できると信じています。

実際、著者が言いたいのは、基本を決して無視してはいけないということです。これ以上長々とせずに、基本的なソートアルゴリズムに直接進みましょう。

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

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

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

バブルソート

使用条件: コレクションの要素はサイズを比較できます

アルゴリズムのアイデア: ソートするレコードを継続的にスキャンします。スキャンするたびに、最小のレコードが見つかり、それが一番上に近づきます。各スキャンではレコードが最終的な最も正しい位置に配置されるため、次のスキャンではレコードを再確認する必要がありません。

プログラミング例: int b[10]={77,1,65,13,​​81,93,10,5,23,17} はバブルソートされます (ここで概念を混同していました。指摘してくれた zdd に感謝します)

  1. //バブルソート 
  2. voidバブル( int b[10])
  3. {
  4. 整数温度;
  5. 整数i;
  6. (i=9;i>0;i--)の場合
  7. {
  8. ( int j=0;j<i;j++)の場合
  9. {
  10. (b[j]>b[j+1])の場合
  11. {
  12. temp = b[j];
  13. b[j] = b[j+1];
  14. b[j+1] = 一時;
  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)

シェルソート

使用条件: コレクションの要素はサイズを比較できます

アルゴリズムのアイデア: まず、ソートするレコードのシーケンス全体をいくつかのサブシーケンスに分割し、それぞれに対して直接挿入ソートを実行します。シーケンス全体のレコードが「基本的に順序付けられている」場合は、すべてのレコードに対して直接挿入ソートを実行します。 サブシーケンスは単に「セグメントに分割」されるのではなく、特定の「増分」で区切られたレコードによってサブシーケンスが形成されます。そのため、比較して並べ替えるときに、キーワードが小さいレコードは段階的に前に進むのではなく、一定の増分で移動します。「増分」は減少傾向を示し、最終的にこの「増分」は常に 1 になります。このとき、シーケンスは基本的に順序付けられており、並べ替えを完了するために必要な比較と移動はわずかです。シェルソートの増分設定がわかりにくい。一般的に、8 つの数字の「増分」を 4、2、1 に設定することを検討します。 (これはシェルソートの一般的な設定です)。次に、「増分」h(n+1)=3*h(n)+1 を計算する式を作成します (h>N/9 で停止)。この式は増分には最適ではないかもしれませんが、一般的な「増分」設定には適用できます。数字が 8 個ある場合、ここでの増分は 1 です。

プログラミング例: int b[10]={77,1,65,13,​​81,93,10,5,23,17}はシェルをソートする

  1. //ヒルソートの自動増分は自分で選択する必要があります 
  2. voidシェルソート( int b[10])
  3. {
  4. 整数h,i;
  5. 整数n=10;
  6. //このループを通して、1と4への増分を計算します 
  7. (h=1;h<=n/9;h=3*h+1)の場合
  8.  
  9. //インクリメントループ 
  10. (;h>0;h/=3)の場合
  11. {
  12. (i=h;i<n;i++)の場合
  13. {
  14. 整数j、温度;
  15. temp = b [i];
  16. // ソートを挿入 
  17. (j=ih;j>=0;j=jh)の場合
  18. {
  19. (b[j]>temp)の場合
  20. {
  21. b[j+h]=b[j];
  22. }
  23. それ以外 
  24. {
  25. 壊す;
  26. }
  27. }
  28. b[j+h]=温度;
  29. }
  30. }
  31. cout<< "ソートは次のようになります:" ;
  32. ( int i=0;i<10;i++ )の場合
  33. {
  34. cout<<b[i]<< " " ;
  35. }
  36. cout<<endl;
  37. }

パフォーマンス分析: ヒルソートの時間計算量は少々複雑です。特定の「増分」に応じて変化します。ここでは、著者は Yan Weimin の「データ構造」から O(n^3/2) を使用しています。

クイックソート

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

アルゴリズムのアイデア: ソート パスを通じて、ソートするレコードは 2 つの独立した部分に分割されます。レコードの一方の部分のキーワードがもう一方の部分のキーワードよりも小さい場合、レコードの 2 つの部分を別々にソートして、最終的に順序付けられたシーケンスに到達できます。ここで重要なポイントは、セグメンテーションの「ベンチマーク」を選択することです。この「ベンチマーク」より大きい場合は 1 つの部分に分割し、この「ベンチマーク」より小さい場合は 1 つの部分に分割する必要があります。ここで、著者はデフォルトでこの部分の最初のレコードを「ベンチマーク」として使用します。

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

  1. //クイックソート 
  2. voidクイックソート( int *b, int下限, int上限)
  3. {
  4. //スワップ関数 
  5. void Sawp( int *a, int *b);
  6. 古い低= 低値;
  7. 古い高=高;
  8. (<高)
  9. {
  10. (*(b+high)>=*(b+low)&&low<high)high-- の場合;
  11. Sawp(b+low,b+high);
  12. (*(b+low)=<*(b+high)&&low<high)low++の場合;
  13. Sawp(b+low,b+high);
  14. }
  15. (Old_low<low-1)の場合
  16. {
  17. クイックソート(b,Old_low,low-1);
  18. }
  19. (高+1<古い高)の場合
  20. {
  21. クイックソート(b,high+1,Old_high);
  22. }
  23. }
  24.  
  25. //スワップ関数 
  26. void Sawp( int *a, int *b)
  27. {
  28. 整数温度;
  29. 温度=*a;
  30. *a=*b;
  31. *b=一時;
  32. }

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

原文: http://www.cnblogs.com/couhujia/archive/2011/03/24/1993373.html

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

>>:  基本的なプログラミングアルゴリズムを簡単に習得する(I)

ブログ    
ブログ    
ブログ    

推薦する

AI が台頭して 9 年目を迎えた今、どんな大きな可能性があるのでしょうか?

2012年以来、人工知能の復活は9年目に入りました。「人工知能とは何か」に対する人々の認識は、当初...

...

...

Huggingfaceによる大規模モデル進化ガイド:GPT-4を完全に再現する必要はない

ビッグデータダイジェスト制作ChatGPTが人気を博した後、AIコミュニティは「百式戦争」を開始しま...

...

コード不要で再利用可能な AI が AI の溝を埋める方法

著者: ミシェル・ゾウ翻訳:李睿企画丨孫淑娊[51CTO.com クイック翻訳]事前に構築された A...

AIを活用した臨床モニタリングシステムの台頭

人工知能(AI)は生活のあらゆる分野に浸透しています。人工知能は医療にどのようなメリットをもたらすの...

偽造AIがまた進化しました!たった一枚の写真で、スピーチと歌のビデオが自動的に生成されます

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

10,000倍速い!バークレーはSQLクエリを最適化するためにディープRLを使用することを提案している

SQL 結合を最適化する方法は、データベース コミュニティが何十年にもわたって研究してきた大きな問題...

...

2018 年に先導するオープンソース AI プロジェクトはどれでしょうか?

[[219623]] [51CTO.com クイック翻訳] 最近では、人工知能 (AI) や機械学...

金融ロボットの解読:毒ではなくアシスタント

[[231414]]会計、税務、監査などの業務でロボットが人間に取って代わったらどうなるか想像してみ...

Spark を使用して行列分解推奨アルゴリズムを学習する

[[182792]]協調フィルタリング推奨アルゴリズムにおける行列分解の応用では、推奨アルゴリズムに...

デジタル時代のパフォーマンス管理:現実と未来

デジタルパフォーマンス管理の変革デジタル目標設定パフォーマンス計画は、企業の繁栄戦略と業務を結び付け...