ホームページ バックエンド開発 Python チュートリアル Python で 8 つの並べ替えアルゴリズムを実装する方法

Python で 8 つの並べ替えアルゴリズムを実装する方法

Mar 11, 2017 am 10:10 AM
python ソートアルゴリズム

この記事では主に 8 つの並べ替えアルゴリズムの Python 実装を紹介し、8 つの並べ替えアルゴリズムの詳細な説明とコード実装を提供します。興味のある方は、

8 つの並べ替えアルゴリズムの Python 実装を参照してください。具体的な内容は次のとおりです。

1. 挿入ソート説明

挿入ソートの基本的な動作は、ソート済みの順序付きデータにデータを挿入し、その数値に 1 を加えた新しい順序付きデータを取得することです。このアルゴリズムは、少量のソートに適しています。のデータの場合、時間計算量は O(n^2) です。安定した選別方法です。挿入アルゴリズムは、ソートされる配列を 2 つの部分に分割します。最初の部分には、最後の要素を除く配列のすべての要素が含まれます (配列に挿入位置を追加するためのスペースが 1 つ増えます)。2 番目の部分には、この要素のみが含まれます。 1 つの要素 (つまり、挿入される要素)。最初の部分がソートされた後、この最後の要素がソートされた最初の部分に挿入されます。

コードの実装

def insert_sort(lists):
  # 插入排序
  count = len(lists)
  for i in range(1, count):
    key = lists[i]
    j = i - 1
    while j >= 0:
      if lists[j] > key:
        lists[j + 1] = lists[j]
        lists[j] = key
      j -= 1
  return lists
ログイン後にコピー

2. ヒルソート
説明

ヒルソート(シェルソート)は挿入ソートの一種です。これは削減増分ソートとも呼ばれ、直接挿入ソート アルゴリズムのより効率的かつ改良されたバージョンです。ヒル ソートは、不安定なソート アルゴリズムです。この方法はDLによるものです。シェルは 1959 年に提案されたことにちなんで名付けられました。 ヒル ソートでは、添字の特定の増分でレコードをグループ化し、直接挿入ソート アルゴリズムを使用して各グループをソートします。増分が徐々に減少するにつれて、各グループにはさらに多くのキーワードが含まれます。増分が 1 まで減少すると、ファイル全体がグループ化されます。ちょうど 1 つのグループに分割され、アルゴリズムは終了します。

コードの実装

def shell_sort(lists):
  # 希尔排序
  count = len(lists)
  step = 2
  group = count / step
  while group > 0:
    for i in range(0, group):
      j = i + group
      while j < count:
        k = j - group
        key = lists[j]
        while k >= 0:
          if lists[k] > key:
            lists[k + group] = lists[k]
            lists[k] = key
          k -= group
        j += group
    group /= step
  return lists
ログイン後にコピー

3. バブルソート
説明

ソート対象のシーケンスを繰り返し訪問し、一度に 2 つの要素を比較し、順序が間違っている場合はそれらを入れ替えます。配列を訪問する作業は、それ以上の交換が必要なくなるまで繰り返されます。これは、配列がソートされたことを意味します。

コードの実装

4. クイックソート

説明

1 回の並べ替えパスを通じて、並べ替えられるデータを 2 つの独立した部分に分割します。他の部分は小さく、このメソッドを使用してデータの 2 つの部分をそれぞれすばやく並べ替えることができ、並べ替えプロセス全体を再帰的に実行できるため、データ全体が順序付けされたシーケンスになります。
コード実装

def bubble_sort(lists):
  # 冒泡排序
  count = len(lists)
  for i in range(0, count):
    for j in range(i + 1, count):
      if lists[i] > lists[j]:
        lists[i], lists[j] = lists[j], lists[i]
  return lists
ログイン後にコピー

5. 直接選択ソート

説明

基本的な考え方: 最初のパスでは、ソート対象のレコード r1 ~ r[n] の中から最小のレコードを選択し、それを結合します。 r1 Exchange; 2 番目のパスでは、ソート対象のレコード r2 ~ r[n] の中から最小のレコードを選択し、それを r2 と交換します。以降、ソート対象のレコードの i 番目のパス r[i] となります。 ] ~ r[n] 最小のレコードを選択し、それを r[i] と交換します。これにより、順序付けられたシーケンスは、すべてがソートされるまで増加し続けます。
コード実装

def quick_sort(lists, left, right):
  # 快速排序
  if left >= right:
    return lists
  key = lists[left]
  low = left
  high = right
  while left < right:
    while left < right and lists[right] >= key:
      right -= 1
    lists[left] = lists[right]
    while left < right and lists[left] <= key:
      left += 1
    lists[right] = lists[left]
  lists[right] = key
  quick_sort(lists, low, left - 1)
  quick_sort(lists, left + 1, high)
  return lists
ログイン後にコピー

6. ヒープソート

説明

ヒープソートは、積み重ねられたツリー (ヒープ) のデータ構造を使用して設計されたソート アルゴリズムを指します。配列の特性を利用して、指定したインデックスにある要素をすばやく見つけることができます。ヒープは、大きなルート ヒープと小さなルート ヒープに分割され、完全なバイナリ ツリーになります。大規模なルート ヒープの要件は、各ノードの値がその親ノードの値以下であること、つまり A[PARENT[i]] >= A[i] であることです。配列の非降順ソートでは、大きなルート ヒープの要件に従って、最大値がヒープの先頭になければならないため、大きなルート ヒープを使用する必要があります。
コードの実装

def select_sort(lists):
  # 选择排序
  count = len(lists)
  for i in range(0, count):
    min = i
    for j in range(i + 1, count):
      if lists[min] > lists[j]:
        min = j
    lists[min], lists[i] = lists[i], lists[min]
  return lists
ログイン後にコピー

7. マージソート

説明

マージソートは、分割統治法 (pide と Conquer) を使用する非常に典型的なアプリケーションです。すでに順序付けされているサブシーケンスをマージして、完全に順序付けされたシーケンスを取得します。つまり、まず各サブシーケンスを順序どおりにしてから、サブシーケンス セグメントを順序どおりにします。 2 つの順序付きリストが 1 つの順序付きリストにマージされる場合、それは双方向マージと呼ばれます。
マージプロセスは次のとおりです: a[i] と a[j] のサイズを比較し、a[i]≤a[j] の場合、最初の順序付きリストの要素 a[i] を r[k ] にコピーします。それ以外の場合は、2 番目の順序付けされたリストの要素 a[j] を r[k] にコピーし、j と k にそれぞれ 1 を追加するというように、順序付きリストの 1 つがフェッチされるまで続きます。 、次に、もう一方の順序付きリストの残りの要素を、r の下付き文字 k から下付き文字 t までのセルにコピーします。通常、再帰を使用してマージ ソート アルゴリズムを実装します。まず、ソート対象の区間 [s, t] を中間点で 2 つに分割し、次に左側のサブ範囲をソートし、次に右側のサブ範囲をソートし、最後に を使用します。左側の間隔と右側の間隔の間のマージ操作。順序付けされた間隔 [s,t] にマージします。

コード実装

# 调整堆
def adjust_heap(lists, i, size):
  lchild = 2 * i + 1
  rchild = 2 * i + 2
  max = i
  if i < size / 2:
    if lchild < size and lists[lchild] > lists[max]:
      max = lchild
    if rchild < size and lists[rchild] > lists[max]:
      max = rchild
    if max != i:
      lists[max], lists[i] = lists[i], lists[max]
      adjust_heap(lists, max, size)

# 创建堆
def build_heap(lists, size):
  for i in range(0, (size/2))[::-1]:
    adjust_heap(lists, i, size)

# 堆排序
def heap_sort(lists):
  size = len(lists)
  build_heap(lists, size)
  for i in range(0, size)[::-1]:
    lists[0], lists[i] = lists[i], lists[0]
    adjust_heap(lists, 0, i)
ログイン後にコピー

8. 基数ソート

説明

基数ソート(基数ソート)は、「バケットソート」またはビンソートとも呼ばれる「分散ソート」(分散ソート)に属します。名前が示すように、ソート効果を達成するためにキー値情報の一部を通じてソート対象の要素を特定の「バケット」に割り当てます。基数ソート方法は安定したソートであり、その時間計算量は O (nlog(r)m) です。ここで、r は取得されるベース、m はヒープの数です。場合によっては、基数ソート方法が他の安定性ソート方法よりも効率的です。
コードの実装

import math
def radix_sort(lists, radix=10):
  k = int(math.ceil(math.log(max(lists), radix)))
  bucket = [[] for i in range(radix)]
  for i in range(1, k+1):
    for j in lists:
      bucket[j/(radix**(i-1)) % (radix**i)].append(j)
    del lists[:]
    for z in bucket:
      lists += z
      del z[:]
  return lists
ログイン後にコピー

以上就是Python实现八大排序算法的详细介绍,希望对大家的学习有所帮助。

以上がPython で 8 つの並べ替えアルゴリズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

XML形式を美化する方法 XML形式を美化する方法 Apr 02, 2025 pm 09:57 PM

XMLの美化は、合理的なインデンテーション、ラインブレーク、タグ組織など、本質的に読みやすさを向上させています。原則は、XMLツリーを通過し、レベルに応じてインデントを追加し、テキストを含む空のタグとタグを処理することです。 PythonのXML.ETREE.ELEMENTTREEライブラリは、上記の美化プロセスを実装できる便利なchile_xml()関数を提供します。

携帯電話のXMLファイルをPDFに変換する方法は? 携帯電話のXMLファイルをPDFに変換する方法は? Apr 02, 2025 pm 10:12 PM

単一のアプリケーションで携帯電話でXMLからPDF変換を直接完了することは不可能です。クラウドサービスを使用する必要があります。クラウドサービスは、2つのステップで達成できます。1。XMLをクラウド内のPDFに変換し、2。携帯電話の変換されたPDFファイルにアクセスまたはダウンロードします。

XML形式を開く方法 XML形式を開く方法 Apr 02, 2025 pm 09:00 PM

ほとんどのテキストエディターを使用して、XMLファイルを開きます。より直感的なツリーディスプレイが必要な場合は、酸素XMLエディターやXMLSPYなどのXMLエディターを使用できます。プログラムでXMLデータを処理する場合、プログラミング言語(Pythonなど)やXMLライブラリ(XML.ETREE.ELEMENTTREEなど)を使用して解析する必要があります。

XMLをPDFに変換できるモバイルアプリはありますか? XMLをPDFに変換できるモバイルアプリはありますか? Apr 02, 2025 pm 09:45 PM

XML構造が柔軟で多様であるため、すべてのXMLファイルをPDFSに変換できるアプリはありません。 XMLのPDFへのコアは、データ構造をページレイアウトに変換することです。これには、XMLの解析とPDFの生成が必要です。一般的な方法には、ElementTreeなどのPythonライブラリを使用してXMLを解析し、ReportLabライブラリを使用してPDFを生成することが含まれます。複雑なXMLの場合、XSLT変換構造を使用する必要がある場合があります。パフォーマンスを最適化するときは、マルチスレッドまたはマルチプロセスの使用を検討し、適切なライブラリを選択します。

携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? 携帯電話でXMLをPDFに変換するとき、変換速度は高速ですか? Apr 02, 2025 pm 10:09 PM

Mobile XMLからPDFへの速度は、次の要因に依存します。XML構造の複雑さです。モバイルハードウェア構成変換方法(ライブラリ、アルゴリズム)コードの品質最適化方法(効率的なライブラリ、アルゴリズムの最適化、キャッシュデータ、およびマルチスレッドの利用)。全体として、絶対的な答えはなく、特定の状況に従って最適化する必要があります。

XMLをPDFに変換できるモバイルアプリはありますか? XMLをPDFに変換できるモバイルアプリはありますか? Apr 02, 2025 pm 08:54 PM

XMLをPDFに直接変換するアプリケーションは、2つの根本的に異なる形式であるため、見つかりません。 XMLはデータの保存に使用され、PDFはドキュメントを表示するために使用されます。変換を完了するには、PythonやReportLabなどのプログラミング言語とライブラリを使用して、XMLデータを解析してPDFドキュメントを生成できます。

携帯電話でXMLをPDFに変換する方法は? 携帯電話でXMLをPDFに変換する方法は? Apr 02, 2025 pm 10:18 PM

携帯電話でXMLをPDFに直接変換するのは簡単ではありませんが、クラウドサービスの助けを借りて実現できます。軽量モバイルアプリを使用してXMLファイルをアップロードし、生成されたPDFを受信し、クラウドAPIで変換することをお勧めします。クラウドAPIはサーバーレスコンピューティングサービスを使用し、適切なプラットフォームを選択することが重要です。 XMLの解析とPDF生成を処理する際には、複雑さ、エラー処理、セキュリティ、および最適化戦略を考慮する必要があります。プロセス全体では、フロントエンドアプリとバックエンドAPIが連携する必要があり、さまざまなテクノロジーをある程度理解する必要があります。

画像に変換されたXMLのサイズを制御する方法は? 画像に変換されたXMLのサイズを制御する方法は? Apr 02, 2025 pm 07:24 PM

XMLを介して画像を生成するには、XMLのメタデータ(サイズ、色)に基づいて画像を生成するために、ブリッジとしてグラフライブラリ(枕やJFreechartなど)を使用する必要があります。画像のサイズを制御するための鍵は、&lt; width&gt;の値を調整することです。および&lt; height&gt; XMLのタグ。ただし、実際のアプリケーションでは、XML構造の複雑さ、グラフ描画の細かさ、画像生成の速度とメモリ消費の速度、および画像形式の選択はすべて、生成された画像サイズに影響を与えます。したがって、グラフィックライブラリに熟練したXML構造を深く理解し、最適化アルゴリズムや画像形式の選択などの要因を考慮する必要があります。

See all articles