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

##################クイックソート#######################

「」 " 

クイックソートは分割統治(分割統治)より小さい及び大きいサブシーケンスに配列(リスト)2の戦略は、ソート再帰的に二つの配列を使用する。

手順:
1、基準値の選択を素子の列の数を選ぶ、「参照」(ピボット)と呼ばれる; 
2、セグメンテーション:並べ替え列、基準値よりもすべて小さいが、基準要素の前に配置され、すべての基準値よりも大きい要素は参照の背後に配置され(いずれかの側にあってもよい数の基準値に等しい)。
分割の終了後、基準値が完了したソーティング; 
3、再帰ソート配列:配列よりも再帰的に小さなを素子の基準値は、基準値の要素よりも大きいです順序付けられたサブシーケンス。
再帰的に決意条件の一番下には、列の数が明らかに順序付けられ、その時点で列の数またはゼロのサイズ、です。 

「」"

 

##################クイックソート#######################

「」 " 
連想リスト= [54 20であり、44は、55である、93 ,. 17、26である77、31] 
達成最初の
左、2つのカーソルにより、右、基準値としての第1素子 、第1の車輪54基準値、左カーソルポイント26、右カーソル20点と 終了条件が低<=右あり 、そうでない場合は停止し、左点が54よりも小さくなるように 、右54より大きくを指し、そうでない場合は停止し 、次いで交換については、終了条件が満たされるまで、最初のラウンドの終わり続ける 第二ラウンドは、再帰的に、同じ操作を実行し続ける ことがマージの再帰処理の終了となっています
。「」 "

コード:

DEF quick_sort(連想リスト、まず、最終):
     "" " クイック" "" 
    IFファースト> =最終:   再帰の終了条件が
        返す
    mid_value = 連想リスト[ファースト]  =まず        ハイ= 最終
     ながら低<高:   覚えています交互に行うライブ、2つのカーソルが重なっ終了時間である場合、
        一方低<高連想リスト[高]> = mid_value:
            ハイ。 - 1 = 
        連想リスト[低] = 連想リスト[高]  
         ながら低<高連想リスト[低] <  mid_value: + = 1 
        連想リスト[高] = 連想リスト[低]
     ループが終了した後、低、および高等しく、 
    連想リスト[低] = mid_value   この位置に基準要素は、
    参照配列要素のソート素早く左 
    (quick_sort連想リスト、まず、低- 1)  まず:低0 -1で元の基準要素が一つ左
    #をすばやくソート基準配列要素の右側 
    quick_sort(連想リスト、低+ 1、最終)   低+ 1:元のベースライン最後右エレメント:最終


IF  __name__ == ' __main__ ' 
    連想リスト = [54、31であり、44は、55であり、20は、26であり、77 93 ,. 17である] 
    quick_sort(連想リスト、0、lenの(連想リスト)。 - 1 プリント(リスト)

 

最適な時間複雑分析

「」 " 

コードのルック良い分析、ロジックを見て
1は、最初のラウンドは、N-、の複雑さである
2、N-、の複雑さの第二ラウンドで
3、どのように多くのラウンド終了?対数、LOGNに、
最適な時間の複雑さ:合計は、O(nlogn)であり、最良の場合は、すべての値が中央にあることである
最悪時間計算量はO(^ N-2)
「"」

 

##################クイックソート#######################

第二のバージョンは、# 

これは、アルゴリズムの概要内部比較Aの方法であって、前記異なる断片化プロセス、最初のサイクルであり、であることが旅行断片、比較、簡単なコードを完了するために複数、


この関数は2つの分割されたリターン・インデックスに分割され、このインデックスは、別に基準値よりも、別に基準値よりも大きいARR = 10 ,. 7 ,. 8 ,. 9,2 、1 ,. 5]。 DEFのパーティション(ARR、低、高): 私は =(低- 1)最小要素インデックス ピボット= ARR []高 右端最も分割点 のために J 範囲(低、高) : 現在の要素は、以下または旋回等しい IF ARR [J] <=ピボット: 各リストを要素と比較基準値 。IがI +を= 1つの 最初のトリガが0になることであり、最初の要素は最小値を表します。 、 ARR [I]、ARR [J] = ARR [J]、ARR [I] 前のステップが表すので、最初の要素は、最小であり、したがって、Iを交換する iがリスト2 =:ときに、ループ終了上記[2,1,8,9,10,7,5] ARR [I + 1。 ]、ARR [高] = ARR [高]、ARR [I + 1] #1 高= 5この時間高が基準値I + 1と呼ばれ、8であり、そして 交換後、左側の基準値より少ない基準値よりも大きいです右側には、基準値よりも大きい リターン(I + 1)インデックスがiが+ 1、分割点の基準値と呼ばれる戻り #1 ARR [] - >ソート配列ロー- >開始インデックスハイ- >終了インデックス #のクイックソート機能 DEF クイック(ARR、低、高): IF低< 高: PI = パーティション(ARR、低、高) クイックソート(ARR、低、PI - 1。 クイック(ARR、PI。+ 1 、高) ARR = 10 ,. 7 ,. 8 ,. 9,2 ,. 1 ,. 5 ] N- = LEN(ARR) クイック(ARR、0、N- 1 - 。 プリント" ソート済みアレイ:" のための I レンジ(N): 印刷" %のD "%のARR [I])

 

##################クイックソート#######################

「」 " 
まず私は、擬似高速ロウと呼ばれるコードの迅速な排水を見たい:
このコードは、このパラメータのキーピボットで、コードは、この要素パケット、シーケンスの最初の要素を取ります右のそれ大きい値よりも、その左にそれがよりリストの値が小さいことは、分析式を用いて、参照、
これらの配列の各再帰ソート。
DEF クイックソート(ARR):    
     場合 lenの(ARR)<= 1 リターンARR     
    ピボット = ARR [LEN(ARR)// 2 ]      = [X  X 到着する場合、X < ピボット]     
    中間 = [X のための X  ARR もし X == ピボット]      = [X  X 到着する場合、X> ピボット]    
     戻りクイック(左)+中間+ クイック(右)
 印刷(クイックソート([3、6、8、19、1、5]))  [1,3、5、6、8、19]
 
DEF quick_sort(B):
     "" " クイック" "" 
    IF LEN(B)<2 リターンARR
     容易に選択することができる選択基準、中間の選択を容易に理解 
    ミッド= ARR [lenは(B) // 2 ]
     #は約2系列の基準値を定義する 
    左、右= []、[]
    元の配列の基準値から除去
    b.remove(MID)
     のための項目Bは:
         #は、放電の右側の基準値よりも大きいの
        IF項目> = MID:
            right.append(項目)
        左側に置く基準値よりも小さい
            left.append(項目)
     反復を比較する使用
    リターン quick_sort(左)+ [中期] + quick_sort(右)
 
 

ショートコードの理解を容易にするが、その効率は、主に以下の分野では、非常に低いですが:
パケット単位の選択、あまりにもカジュアル、必ずしも中央値のリストが表示されない
大規模な、二つのリストの分析式のスペースの複雑さ、およびあなたは、シーケンス全体に比較のために選択するたびにトラバースする必要があります。
配列の長さは(わずか数ような要素)が小さすぎる場合、急速放電効率が挿入ソートとして良いようではありません。
再帰は、最高の最適化がパフォーマンスに影響を与えます。

「」 "

 

##################クイックソート#######################

「」 " 
機能
安定性:クイックドレーンが不安定でソート、そのようなものがある基準値と同じ要素の基準値の前後に存在する、同じ値は、このように前の相対的な順序破壊、別に設定される

比較を:時間との比較要素をソートするために必要なので、比較的一種である

時間計算:O(nlogn)の高速放電時間の複雑

空間的複雑:彼らは、サイズを増加させると列の数の増加に伴って空間を選別適用する必要があります大型、複雑さがある:O(nlogn)

マージソートとクイックドレーン:マージソートとクイックドレーン二種類の分割統治する方法である配列決定、それらが分解し、合わせたポリシーが同じではない:マージを直接中央から2分割された列の数に、
マージソートは、まだ合併の時に再び順序を変更するために、2つの列が必要になりますし、高速な行は直接統合ソートに不要になった、であるように、高速放電が比較的小さい場所は、右に大きな場所後に残されている
ので、高速並列処理のマージ2いくつかの違いを並べ替え、より効率的には、図から比較することができます。 クイックソートは、小さなデータセットのパフォーマンスは非常に良いではないという欠点があるしました。「」
"

 

##################クイックソート#######################

 

##################クイックソート#######################

おすすめ

転載: www.cnblogs.com/andy0816/p/12348378.html