交換ソート:バブルソートとクイックソート

       交換とは、シーケンス内の2つの要素のキーワードの比較結果に従って、シーケンス内の2つの要素の位置を交換することです。多くのソートアルゴリズムの中で、バブリングと高速ソートは交換ソートに属します。

 

1つは、バブルソート

1.基本的な考え方:

水で泡立つのと同様に、小さいものは浮き上がり、大きいものは沈みます。2つの数値を比較すると、大きい数が後方に移動し、小さい数が前方に移動します。

2.アルゴリズムの説明:

シーケンスの最後の要素を前の要素とペアで比較します。順序が逆の場合は、要素の位置を交換します。

上記の方法に従って、最初の要素までペアワイズ比較を実行すると、最初の要素が最小値と最終位置になります。

ソートが完了するまで、上記の2つの手順に従って残りのシーケンスを比較します。

3.コーディングの実現:

def swap(s, a, b):
    temp = s[a]
    s[a] = s[b]
    s[b] = temp


def bubblesort(instr):
    n = len(instr)
    for i in range(n-1):
        for j in range(i,n)[::-1]:
            if instr[j-1] > instr[j]:
                swap(instr, j-1, j)


if __name__ == '__main__':
    instr = input().split()
    bubblesort(instr)
    print(''.join(instr))

上記のコードは、ソートを実現するためのバブルメソッドです。比較の数は、シーケンスの初期状態とは関係ありません。常にn *(n-1)/ 2なので、時間の複雑さはO(n ^ 2)です。一定数の補助ユニットが使用されるため、スペースの複雑度はO(1)です。

しかし、最初のシーケンスが正しい場合、この比較は間違いなくリソースと時間を浪費します。効率を向上させるために、変数フラグを設定できます。flagが0の場合、シーケンスが順序付けされたシーケンスであり、バブルソート比較を実行する必要がないことを意味します。ループを直接終了するだけです。このように、最良の場合、移動の数は0、比較の数はn-1、時間の複雑さはO(n)です。エンコーディングは次のとおりです。

def swap(s, a, b):
    temp = s[a]
    s[a] = s[b]
    s[b] = temp


def bubblesort(instr):
    n = len(instr)
    for i in range(n-1):
        flag = 0
        for j in range(i,n)[::-1]:
            if instr[j-1] > instr[j]:
                swap(instr, j-1, j)
                flag = 1
        if flag == 0:
            return


if __name__ == '__main__':
    instr = input().split()
    bubblesort(instr)
    print(''.join(instr))

4.例:

最初のシーケンスを並べ替えます:5、4、3、2、1の小さいものから大きいものへ

最初の並べ替えプロセス:4回比較

2番目の並べ替えプロセス:3回比較

3番目の並べ替えプロセス:2回比較

4番目の並べ替えプロセス:1回の比較

5.アルゴリズム分析:

並べ替えの各パスはn-1回の比較を実行します。比較の各パスの後、要素は最終位置に配置され、残りの並べ替え番号はn-1になります。合計でn-1回の比較が必要です。最良の場合、比較の数はn、移動の数は0、時間の複雑さはO(n)です。最悪の場合、比較の数はn *(n-1)/ 2で、移動の数は3 * n *です。 (n-1)/ 2、時間の複雑さはO(n ^ 2)です。要素が等しい場合、スワップ操作は実行されないため、バブルソートは安定したソートアルゴリズムです。

 

2、クイックソート

1.基本的な考え方:分割統治法に基づいて、並べ替えの対象となるシーケンスは、並べ替えによって2つの部分に分割されます。シーケンスの一部の要素は参照要素よりも小さく、シーケンスの他の部分の要素は参照要素よりも大きくなります。シーケンスの2つの部分は、シーケンス全体が順序付けられるまでソートされます。

2.アルゴリズムの説明:

シーケンスから参照要素を選択します。

シーケンスを並べ替え、参照要素より小さいすべての要素を前に置き、参照要素より大きいすべての要素を後ろに置き、参照要素の最終位置を返します。

参照要素の位置に従って、シーケンスを2つのサブシーケンスに分割します。

シーケンスが整うまで、シーケンスの各部分に対して上記の3つのステップを実行します。

3.コーディングの実現:

def partition(instr, low, high):
    p = instr[low]
    while low < high:
        while low < high and instr[high] >= p:
            high = high-1
        instr[low] = instr[high]
        while low < high and instr[low] <= p:
            low = low+1
        instr[high] = instr[low]
    instr[low] = p
    return low


def quickSort(instr, low, high):
    if low < high:
        p = partition(instr,low,high)
        quickSort(instr,low,p-1)
        quickSort(instr,p+1,high)


if __name__ == '__main__':
    instr = input().split()
    quickSort(instr,0,len(instr)-1)
    print(''.join(instr))

4.例:

       最初の要素をベンチマークとして、3、5、1、6、2、7、4、9を小さいものから大きいものに並べ替えます。

最初のパーティション:2つの部分に分かれています

  、

3に基づいて2つの部分に分割し、順序が整うまで、上記のように3の前後の2つのシーケンスを分割します。

5.アルゴリズム分析:

      各ソート後、参照要素はシーケンスの最後の位置に配置されます。最良の場合、スペース容量は再帰呼び出しの最大深度であるlog2(n + 1)と一致します。最悪の場合、n-1の再帰呼び出しが必要であり、スタックの深度はn-1です。したがって、最大スペースの複雑さは、悪いケースではO(n)、平均的なケースではO(log2 n)です。最良の場合、時間の複雑度はO(n log2 n)であり、最悪の場合、時間の複雑度はO(n ^ 2)です。並べ替え処理中に2つの要素が両方とも参照要素よりも小さい場合、それらは両方とも移動され、元の順序が変更される可能性があり、最終的な順序が元の順序と一致しなくなる可能性があります。そのため、クイックソートは不安定な並べ替え方法です。

おすすめ

転載: blog.csdn.net/VinWqx/article/details/104858424