Pythonのアルゴリズム図 - すばやくソートし、ソートを選択

著作権:浅い@著作権元の記事を許可なく複製することはできませんhttps://blog.csdn.net/xili2532/article/details/91372648

分割統治

よく知られた再帰的な問題解決:分割統治(分割統治、D&C )。
D&Cの作品:
(1)単純なベースライン条件を識別し、
(2)それは、ベースライン条件満たすように、問題の規模を縮小する方法を決定する
ベースライン条件を必要とします。再帰関数アレイの製造に関する、アレイベースライン条件は、通常、空であるか、または唯一の要素が含まれトラブルで、チェックインすると、ベースライン条件はそうではありません。
実施例1:リストに含まれる要素の数を計算する再帰関数を書くと

def sum(list):
    if list == []:
        return 0
    else:
        return list[0] + sum(list[1:])

二つの組み合わせリストを直接追加することができます

クイックソート

イデオロギー分割ルールのクイックソートで、
のクイックソートステップ:
(1)基準値を選択します。
(2)2つのサブアレイに配列:要素が基準値よりも小さく、基準値は、要素よりも大きいです。
(3)これらの2つのサブアレイを迅速にソート。
:クイックソート(再帰的な使用のアイデア)の例
単純なアルゴリズムの説明:配列ビット基準値の最初の要素を選択し、二つの新しいアレイを作成が基準値よりも素子及び基準値以上を保存しました。アレイが空になるまで、2つの新たなアレイは、再帰的に動作し、上述しました。基準値は、アレイ及びスプライシングを放置します

def quicksort(array):
  if len(array) < 2:
    # 基线条件:为空或只包含一个元素的数组是“有序”的
    return array
  else:
    pivot = array[0]
    # 由所有小于基准值的元素组成的子数组
    less = [i for i in array[1:] if i <= pivot]
    # 由所有大于基准值的元素组成的子数组
    greater = [i for i in array[1:] if i > pivot]

    return quicksort(less) + [pivot] + quicksort(greater)

選択ソート

選択ソートのステップ:トラバース、最小値を見つけるために、その後、新しいリストに加え、サイクル
対応する位置にそれぞれ選択最小要素

@pysnooper.snoop()
def findSmallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index


@pysnooper.snoop()
def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr

print(selectionSort([5, 3, 6, 2, 10]))

バブルソート

隣接する要素を比較し、選択された最大の各要素は、比較のために、最大の要素は、このように上部に到達するために、1つの場所から、バブリングと同じであってもよいです。
:バブルソートアルゴリズムの動作は以下の通りである。
①隣接する要素を比較します。(昇順で)第2大よりも第1の場合、それらの両者は交換しました。最初から最後のペアの最初の終わりには、隣接する要素のペアごとに同じ作業を行います。これが完了すると、最後の要素は、最大の数です。
②最後の1を除いて、すべての要素については、上記の手順を繰り返します。比較する必要がなくなるまで、各時間より少ないと少ない要素、数字のペアのための上記の手順を繰り返し続けました。

@pysnooper.snoop()
def bubble_sort(alist):
    for j in range(len(alist) - 1, 0, -1):
        # j表示每次遍历需要比较的次数,是逐渐减小的
        for i in range(j):
            if alist[i] > alist[i + 1]:
                # 大的话交换位置
                alist[i], alist[i + 1] = alist[i + 1], alist[i]

li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
bubble_sort(li)
print(li)

挿入ソート

アレイは、2つのフロントとリアの部分に分割され、要素のセットの前部がソートされ、要素の集合は、未分類の一部です。各ソートされていない最初の配列を選択し、コレクション内の適切な位置に挿入ソート。
動作原理:によって順序付けられたシーケンスの構築、ソートされていないデータのために、位置を比較することにより、前後、すなわちからソートされた順番にスキャンして、対応する挿入を見つけます。前後にスキャンプロセス中から実現に挿入ソート、繰り返し徐々に新しい要素を挿入するためのスペースを提供するために、位置を戻す要素を命じする必要があります。そして、同様のバブルソート

ここに画像を挿入説明

def insert_sort(alist):
    # 从第二个位置,即下标为1的元素开始向前插入
    for i in range(1, len(alist)):
        # 从第i个元素开始向前比较,如果小于前一个元素,交换位置
        for j in range(i, 0, -1):
            if alist[j] < alist[j - 1]:
                alist[j], alist[j - 1] = alist[j - 1], alist[j]
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
insert_sort(alist)
print(alist)

シェルソート

シェル・ソートは挿入ソート、挿入ソート、現在及び前回の比較各要素の各要素を最適化し、その後挿入され、シェルソート、最初のステップ、アレイグループは、各グループに対応する一定の長さに応じて挿入ソート、あなたは、重要なデータの分布を調整し、最終的に微調整するクイックソートを実行できるように、
基本的な考え方:もっとして、テーブル内の列の配列と挿入ソート列、それぞれを、このプロセスを繰り返しますが、毎回カラムの長さ(長いステップサイズ、より少ない列数)が行われます。最後に、テーブル全体が一つだけのです。、よりよいこのアルゴリズムを理解するために、テーブルに列を変換するアルゴリズム自体またはソートする配列を使用します。

例えば、我々はステップが5種類ある始めれば、我々は5でこれらのリストを配置した、[1,314,943,382,255,994 6,523,452,773,253,910]数字のようなセットがあるとしテーブルには、より良いアルゴリズムを記述するので、彼らは(垂直要素はステップで構成されている)のようになります。

def shell_sort(alist):
    n = len(alist)
    # 初始步长
    gap = int(n / 2)
    while gap > 0:
        # 按步长进行插入排序
        for i in range(gap, n):
            j = i
            # 插入排序
            while j >= gap and alist[j - gap] > alist[j]:
                alist[j - gap], alist[j] = alist[j], alist[j - gap]
                j -= gap
        # 得到新的步长
        gap = int(gap / 2)
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
shell_sort(alist)
print(alist)

マージソート

トップダウン:再帰的に分解することにより最初の配列は、配列のマージ
:アルゴリズムは簡単に説明する
  分解配列:長さ1の配列は、2つの部分にアレイからの中間体、分解が継続する場合
  、融合分解アレイを作成する,:配列をマージ新しい配列は、配列の要素は、保存のために統合されます。全体の配列要素が除去されるまで、より小さな配列に、要素のサイズへのポインタの現在位置を比較し、最初の二つの配列に新しい要素を指し示すポインタを作成するために、ポインタを後退させます。最後の2つの配列の検査は、要素が新しいアレイに追加され、最終的にソートされた配列中の対応する位置に応じてソートする配列に格納されて除去されません。
  
ここに画像を挿入説明

def merge_sort(alist):
    if len(alist) <= 1:
        return alist
    # 二分分解
    num = int(len(alist) / 2)
    left = merge_sort(alist[:num])
    right = merge_sort(alist[num:])
    # 合并
    return merge(left, right)

def merge(left, right):
    '''合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组'''
    # left与right的下标指针
    l, r = 0, 0
    result = []
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += left[l:]
    result += right[r:]
    return result
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
sorted_alist = merge_sort(alist)
print(sorted_alist)

リンク:いくつかのソートアルゴリズム

おすすめ

転載: blog.csdn.net/xili2532/article/details/91372648