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

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

ブログ    

推薦する

...

いいえ!機械学習は単なる美化された統計ではありません。

ビッグデータダイジェスト制作編集者: JIN、Hope、Jiang Baoshangタイトル画像のパ...

TensorFlow から Theano まで: 7 つのディープラーニング フレームワークの水平比較

ディープラーニング プロジェクトを開始する前に、適切なフレームワークを選択することが非常に重要です。...

音声認識とアプリケーションシナリオの組み合わせが未来への新たな章を開く

過去 20 年間で、音声認識技術は大きな進歩を遂げ、研究室から市場へと移行し始めました。今後10年間...

必要なパラメータはわずか1%で、その効果はControlNetを上回る。新しいAI塗装制御マスターが登場

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

組み込みおよびベクターデータベースの実践ガイド

翻訳者 |ブガッティレビュー | Chonglouこの革命の中心にあるのは、ベクター データベースの...

AI と SEO の組み合わせ: 祝福か呪いか?

検索エンジンは誕生以来、基本的な検索エージェントから人工知能 (AI) と機械学習 (ML) に基づ...

ジェネレーションオートメーション:AI主導の労働力

生成 AI は AI の「津波」を引き起こし、AI 駆動型アプリケーションの急速な開発、広範な採用、...

ニューラルネットワークのトレーニングを4倍高速化! Google Brainチームが「データエコー」アルゴリズムを提案

[[271402]]ムーアの法則の終焉にあたり、GPU やその他のハードウェア アクセラレータによっ...

OpenAI が Stable Diffusion を救います! Ilya Song Yang らによるオープンソースの Dall E3 デコーダー

予想外にも、OpenAI は「競合相手」である Stable Diffusion を活用しました。話...

人工知能が製造業のデジタル変革を推進

製造業における人工知能がデジタル変革を推進製造業における人工知能はデジタル変革を可能にし、より効果的...

TensorFlow Lattice: 柔軟で制御可能、説明可能な機械学習

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

モデルトレーニング: AIと機械学習の最適化とDevOpsツールの利用の改善

フランス料理の秘訣はバター、バター、そしてさらにバターだと言われています。同様に、DevOps の場...

Baidu Brainのインテリジェント会話エンジンが9つのコア機能のリリースで「警笛を鳴らす」

言語は思考と知識を伝達し、人類の文明を推進します。そして会話によって機械はより賢くなり、人間にとって...

将来の成長の原動力は?ビッグデータ+人工知能が浸透し、私たちの生活を変える

画像ソース: Unsplash新世代情報技術の急速な発展に伴い、コンピューティング能力、データ処理能...