面接の質問に必ず読むべき一冊! Python のトップ 5 ソート アルゴリズムとその実装コード

面接の質問に必ず読むべき一冊! Python のトップ 5 ソート アルゴリズムとその実装コード

ソートは、すべての IT エンジニアと開発者にとって不可欠な知識スキルです。コーディング面接に合格するだけでなく、アルゴリズム自体も理解する必要があります。さまざまなソート アルゴリズムは、アルゴリズムの設計がプログラムの複雑さ、速度、効率に大きな影響を与える可能性があることを示す良い例です。

面接でよく聞かれる最も一般的なソートアルゴリズムのトップ 5 を見て、それらを Python で実装する方法を見てみましょう。

[[337940]]

1. バブルソート

バブルソートは、ソートの仕組みを明確に示しながらもシンプルで理解しやすいため、入門レベルの CS コースで最もよく教えられているソートです。バブルソートはリストを順に進み、隣接する要素のペアを比較します。要素の順序が間違っている場合は、入れ替えられます。リストがソートされるまで、リストのソートされていない部分の走査を繰り返します。バブルソートはリストのソートされていない部分を繰り返し通過するため、最悪の場合の複雑さは O(n²) になります。

  1. バブルソートを定義します。
  2. 定義 swap(i, j):
  3. arr[i]、arr[j] = arr[j]、arr[i]
  4.  
  5. n = 長さ(arr)
  6. 交換 = True  
  7.      
  8. x = -1
  9. 交換中:
  10. 交換 = False  
  11. x = x + 1
  12. iが範囲(1, nx)内にある場合:
  13. arr[i - 1] > arr[i]の場合:
  14. スワップ(i - 1, i)
  15. 交換 = True  
  16.                      
  17. リターン

2. 選択ソート

選択ソートも非常に単純で、バブルソートよりも優れています。 2 つから選択する必要がある場合は、デフォルトの「右選択ソート」を使用するのが最適です。選択ソートを使用して、入力リスト/配列を 2 つの部分に分割します。1 つはソートされた項目のサブリスト、もう 1 つはリストの残りを構成する残りの項目のサブリストです。

まず、ソートされていないサブリスト内の最小の要素を見つけて、それをソートされたサブリストの最後に配置します。したがって、最小のソートされていない要素を取得し、ソートされた順序でソートされたサブリストに格納し続けます。リストが完全にソートされるまでこのプロセスが繰り返されます。

  1. def selection_sort(arr):
  2. iが範囲(len(arr))場合:
  3. 最小値 = i
  4.          
  5. j範囲(i + 1, len(arr))内にある場合:
  6. # 最小値を選択
  7. arr[j] < arr[最小値]の場合:
  8. 最小値 = j
  9.  
  10. # ソートされた配列の最後に置く
  11. arr[最小値]、arr[i] = arr[i]、arr[最小値]
  12.              
  13. リターン

3. 挿入ソート

挿入ソートはバブルソートや選択ソートよりも高速で、よりシンプルであると言えます。カードゲームをプレイするときと同じように、カードをシャッフルするプロセスは挿入ソートの繰り返しです。ループの各反復で、挿入ソートは配列から 1 つの要素を削除します。次に、他のソートされた配列内でその要素が属する位置を検索し、そこに挿入します。入力要素がなくなるまでこのプロセスを繰り返します。

  1. def inserting_sort(arr): 挿入ソート
  2.          
  3. iが範囲(len(arr))場合:
  4. カーソル= arr[i]
  5. 位置 = 私
  6.          
  7. pos > 0かつarr[pos - 1] >カーソルの場合:
  8. # リスト内の数字を入れ替える
  9. arr[位置] = arr[位置 - 1]
  10. 位置 = 位置 - 1
  11. # 中断して最終的なスワップを行う
  12. arr[pos] =カーソル 
  13.  
  14. リターン

4. マージソート

マージソートは分割統治アルゴリズムの完璧な例です。このアルゴリズムを使用するには、主に次の 2 つの手順だけが必要です。

(1) ソートされていないリストを、それぞれが 1 つの「ソートされていない」要素を持つ N 個のサブリストになるまで分割し続けます。ここで、N は元の配列の要素数です。

(2)繰り返しマージ、つまり、2つのサブリストを一度にマージして、すべての要素がソートされた配列に完全にマージされるまで、新しいソートされたサブリストを生成する。

  1. def merge_sort(arr):
  2. # 最後の配列を分割する
  3. len(arr) <= 1の場合:
  4. リターン
  5. 中間 = len(arr) // 2
  6. # 両方の部分で再帰的にmerge_sortを実行します
  7. = merge_sort(arr[:mid]), merge_sort(arr[mid:])
  8.  
  9. # 一緒にマージする
  10. merge( left , right ,arr.copy())を返します
  11.  
  12.  
  13. def merge(、 マージ済み ):
  14.  
  15. 左カーソル、右カーソル = 0, 0
  16. left_cursor < len( left )かつright_cursor < len( right ) の場合:
  17.        
  18. # それぞれをソートして結果に入れる
  19. [左カーソル] <=[右カーソル] の場合:
  20. 結合[左カーソル+右カーソル]=[左カーソル]
  21. 左カーソル += 1
  22. それ以外
  23. 結合された[左カーソル + 右カーソル] =[右カーソル]
  24. 右カーソル += 1
  25.              
  26. left_cursorrange(left_cursor, len( left ))内にある場合:
  27. 結合された[左カーソル + 右カーソル] =[左カーソル]
  28.          
  29. right_cursor がrange(right_cursor, len( right ))内にある場合:
  30. 結合された[左カーソル + 右カーソル] =[右カーソル]
  31.  
  32. マージされたリターン

5. クイックソート

クイックソートも、マージソートと同様に分割統治アルゴリズムです。少し複雑ではありますが、ほとんどの標準実装ではマージソートよりもはるかに高速に実行され、最悪の場合でも O(n²) の複雑度に達することはほとんどありません。主なステップは 3 つあります。

(1)まず配列からピボットと呼ばれる要素を選択します。

(2)軸より小さい要素はすべて軸の左に移動し、軸より大きい要素はすべて軸の右に移動します。これをパーティション操作と呼びます。

(3)前の軸の値より小さいか大きい値を持つ要素の各サブ配列に対して、上記2つの手順を再帰的に適用する。

  1. defパーティション(配列、開始終了):
  2. pivot_idx =開始 
  3. i がxrange( begin +1, end +1)内にある場合:
  4. 配列[i] <= 配列[ begin ]の場合:
  5. ピボットIDx += 1
  6. 配列[i]、配列[pivot_idx] = 配列[pivot_idx]、配列[i]
  7. 配列[pivot_idx]、配列[ begin ] = 配列[ begin ]、配列[pivot_idx]
  8. pivot_idxを返す
  9.  
  10. def quick_sort_recursion(配列、 begin end ):
  11. 開始>=終了の場合:
  12. 戻る 
  13. pivot_idx = パーティション(配列、開始終了)
  14. quick_sort_recursion(配列、 begin 、pivot_idx-1)
  15. quick_sort_recursion(配列、pivot_idx+1、終了)
  16.  
  17. def quick_sort(配列、開始= 0、終了= None):
  18. 終了の場合 なし:
  19. end = len(配列) - 1
  20.      
  21. quick_sort_recursion(配列、 begin end )を返す

- 終わり -

多くの学生は、Python を学習する際にさまざまなアルゴリズムの問​​題に遭遇します。簡単に理解できるものもありますが、学習に時間と労力を要するものもあります。

この記事の 5 つのソート アルゴリズムは、Python 初心者に適しています。ほとんどのベテラン プログラマーはすでにソート アルゴリズムに精通しており、面接の過程でそれらを学習することを余儀なくされます。

<<:  Python コーディング面接の前に解くべき 10 個のアルゴリズム

>>:  教師あり学習、教師なし学習、強化学習とは何ですか?ついに誰かが明らかにした

ブログ    
ブログ    

推薦する

清華大学・黄敏烈氏:GoogleのAI人格は本当に目覚めたのか?

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

...

百度、「小度スマートスピーカー」を89元の試用価格で発売

「Xiaodu スマートスピーカーの価格についてお話ししましょうか?」 「売ることがそんなに失礼だな...

小売業における AI の ROI をマクロとミクロのレベルで測定

[[259079]] AI の応用により予測コストが大幅に削減され、企業はますます新しい、予想外の方...

SparseOcc: 完全にスパースな 3D パノラマ占有予測 (セマンティック + インスタンス デュアル タスク)

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

RustベースのZedエディタがオープンソース化され、OpenAIとGitHub Copilotのサポートが組み込まれました

ティム・アンダーソンノアが編集制作:51CTO テクノロジースタック(WeChat ID:blog)...

ChatGPTはオンラインモードを緊急にシャットダウンし、有料のウェブページに無料でアクセスできることが一度明らかになった。

ChatGPT を使用して有料の Web コンテンツに無料でアクセスすることは、まもなくできなくな...

データサイエンス プロジェクトに Scikit-learn Python ライブラリを使用する方法

[[246038]]柔軟で多様な Python ライブラリは、データ分析とデータマイニングのための強...

FacebookのAIはたった1語で手書きを真似できるが、オープンソース化するには強力すぎる

Facebook は最近、画像内のテキスト スタイルをコピーして再現できる新しい画像 AI「Text...

...

...

加速を解き放つ、8月の自動運転業界の動向の概要

[[419694]]チップ不足と疫病の影響により、今年初めから自動運転産業の発展は減速を余儀なくされ...

TensorFlowに関する簡単な例

[[220444]]この記事では、TensorFlowの例をいくつか見て、テンソルテンソルまた、テン...

...