面接の質問に必ず読むべき一冊! 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 個のアルゴリズム

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

ブログ    
ブログ    
ブログ    

推薦する

デジタル経済は新たな時代へ:インターネットが主導権を握り、ビッグデータと人工知能が注目の的

[[208505]]強固な経済基盤がなければ、豊かな国と強い国民は実現できません。中国共産党第19回...

HDに検閲済み!デューク大学が開発したAIが1秒でモザイクを復元

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

マッキンゼー:人工知能の最大の課題と機会

最近、多くの専門家とコミュニケーションをとる中で、人工知能の3つの重要なビジネス面が徐々に明らかにな...

プログラマーは「正直な人が乗っ取る」ことを防ぐために Forgiveness アプリを開発したのでしょうか?

[[267886]]最近、あるニュースに衝撃を受け、言葉を失いました。そして、人々の収入がどこまで...

GraphSAGEグラフニューラルネットワークアルゴリズムの詳細な説明

GraphSAGE は 2017 年の論文ですが、その名前に含まれる 2 つのキーワード「帰納的」と...

...

Facebook のインタラクティブ ニューラル ネットワーク可視化システム ActiVis がニューラル ネットワークの「ブラック ボックス」を公開

これまで、多くのメディアがニューラルネットワークの「ブラックボックス」問題について熱く議論してきまし...

顔検出を実装するための50行のPythonコード

現在、顔認識技術は広く利用されており、決済や本人認証、美容カメラなどに利用されています。 iPhon...

ディープラーニングの背後にある数学的アイデアを分析する

ディープ ニューラル ネットワーク (DNN) は、基本的に複数の接続されたパーセプトロン (パーセ...

ブロックチェーン技術における機械学習

近代化は世界を変える可能性のある新しい画期的なものをもたらしました。現実世界の問題は、単純な従来のア...

...

銀行におけるクラウドコンピューティングと人工知能の利点

クラウド コンピューティング プロバイダーは、データを分析し、スキルの低いユーザー (または予算が限...

人工知能のルーツを解読する

[[384631]] ◇コンピューティングパワーアルゴリズムの重要な基盤として、人工知能チップと人...

あなたの向かいに座っている「オフィス秘書」はロボットかもしれませんか?ロシアが超リアルなロボットを発表

ロボットがいくつかの簡単な作業を実行できることは目新しいことではありません。最近、ロシア西部の都市ペ...

インテリジェントな排便・排尿ケアロボットが4400万人の障害を持つ高齢者の介護問題を解決

データによれば、わが国には60歳以上の高齢者が2億6,400万人以上おり、そのうち1億8,000万人...