データ構造アルゴリズム - 3 つのクイックソート

クイック ソートは、バブル ソート、選択ソート、挿入ソートよりも高速です。

簡単な並べ替えのアイデア:

^要素 P (最初の要素) を取得し、要素 P をその位置に戻します。

^リストは P によって 2 つの部分に分割されます。左側の部分は P より小さく、右側の部分は P より大きくなります。

^再帰的にソートを完了します。

         プロセス:

        5 を取り出して tmp に保存します。5 の位置は左ポインタ、右ポインタは 8、8>5、右ポインタは -1、9 は再び >5、右ポインタは再び -1 です。

        right は 2, 2<5 になるので、左ポインタは (5) にあり、2 になります。このとき、右ポインタは null 要素 (元の 2 の位置) になるので、左ポインタ +1、左ポインタは、要素 7、7>5 であるため、7 はリストの右側に移動し、右ポインタ (2 の元の位置) は 7 になり、以下同様に 2 つのポインタが交互に変換されます。

1 回目のホーミングが完了すると、再び左側と右側がそれぞれホーミングされ、再帰的にソートが完了します。

def quick_sort(li,left,right):  # 一开始传进来left=0
    if left<right:
        mid=partition(li,left,right)  # 返回下标值,从列表第一个值开始,每次定位在中间值
        quick_sort(li,left,mid-1)
        quick_sort(li,mid+1,right)
def partition(li,left,right):
    tmp=li[left]            # 把第一个值存起来
    while left<right:
        while left<right and li[right]>tmp:
            right-=1   # 往左走一步
        li[left]=li[right]   # 右边的值写到左边空位上
        while left<right and li[left]<=tmp:
            left+=1
        li[right]=li[left]  # 把左边的值写到右边空位
    li[left]=tmp            # 把tmp归位
    return left             # 返回mid值,left,right都行

元々逆順であるシーケンスをシーケンシャルシーケンスに配置する場合、各ラウンドでベース要素の位置のみが決定されます。

 最悪の場合、時間計算量は O(n 二乗) まで低下します。

(最初の要素ではなく) 要素を基本要素としてランダムに選択することで、この最悪のシナリオを回避できます。

このように、クイック ソートの時間計算量は O(nlogn) であることがわかります。

おすすめ

転載: blog.csdn.net/qq_64685283/article/details/132311251