クイック ソートは、バブル ソート、選択ソート、挿入ソートよりも高速です。
簡単な並べ替えのアイデア:
^要素 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) であることがわかります。