このノートは私の研究のために、見直し、と思います。(参考ネットワークコード)
所定ARR [] = {49、38、65、97、76、13、27}
アルゴリズムのステップ:
図1に示すように、選択点(典型的には配列の最初の数を選択する)所定の点=指標
2は、左右セット(左列が表す左端即ちARR [0]、右列が表す右端即ちARR [arr.Length - 1]、左右の大きさと後方トラバーサルポイントフォワードを比較するために提供されます)
[右] ARRはインデックスよりも小さい場合3、[左]編曲:あなたはARRの値を見つけるまで、[左] ARRは背中や++後方に見て左側にインデックスよりも大きい場合、インデックスは、比較され、[右]は、インデックスとインデックスが比較されるよりも大きいですあなたは値が(この規定の理由は、配列に依存している今、プレゼンテーションの昇順、注文取りを降順または昇順にソートされている)の指数よりも低い見つけるまで、前面または正面を向いてright--
4、現在の中間配列にセットポイントインデックス
5.繰り返し2は、右==左まで3及び4ステップ
コード例:
1 使用してシステムを。 2 使用System.Collections.Genericと、 3 使用System.Linqのを。 4 使用System.Textのを。 5 使用System.Threading.Tasksと、 6 7 ネームスペース排序__高速排序 8 { 9 クラスプログラム 10 { 11 パブリック 静的 INT [] S = { 49、38、65、97、76、13、27 }。 12 静的 ボイドメイン(文字列[]引数) 13 { 14 FastSort(S、0、s.Length - 1 )。 15 Console.ReadKey()。 16 } 17 18 プライベート 静的 INT SortUnit(INT [] ARR、intです左、INTは右) 19 { 20 のint i =左、J = 右。 21 int型のインデックス= ARR [左]。 22 一方(左< 右) 23 { 24 一方(左インデックス<右[右] ARR &&>)right-- 。 25の ARR [左] = ARR [右]。 26 ながら(<右[左] ARR && <左インデックス)は、左++ 。 27の ARR [右] =のARR [左]。 28 29 } 30 ARR [左] = インデックス。 31 foreachの(VARの項目でARR) 32 { 33 Console.Write(" {0} " 、項目)。 34 } 35 Console.Write(" \ nを" ); 36 リターンは左。 37 } 38 39 公共 静的 ボイド FastSort(INT [] S、intです左、int型右) 40 { 41 であれば(左> =右)のリターン; 42 int型のインデックス= SortUnit(S、左、右)。 43 FastSort(S、左、索引- 1 )。 44 FastSort(S、指数+ 1 、右)。 45 } 46 } 47 }
コンプリートフラグメント並べ替え:
プライベート 静的 INT SortUnit(INT [] ARR、intです左、int型右) { int型 I =左、J = 右。 INTインデックス= ARR [左]。 一方(左<右) // @ 1 { ながら(左<右ARR && [右]>インデックス)right-- 。 ARR [左] = ARR [右]。 一方 ++左(右<インデックスは[左] ARR && <左)。 ARR [右] = ARR [左]。 } [左] ARR =指数; // @ 2 のforeach(VARの項目でARR) { Console.Write(" {0} " 、項目)。 } Console.Write(" の\ n " ); 戻る左; // @ 4 } パブリック 静的 ボイド FastSort(int型 [] Sを、INT左、int型右) // @ 5 { 場合(左> =右)のリターン; INTインデックス= SortUnit(S、左、右)。 FastSort(S、左、索引 - 1 )。 FastSort(S、指数 + 1 、右)。 }
コードの解釈:
@ 1:サイクル配列があると、ソートモード(昇順ここで言う)左右するまで、奥から手前にヒットし、インデックスはこの番号が存在しない場合よりも小さい場合最初に見つけることです(相対的に同じである前後に、同じ停止を横切る比較が前方に移動を開始なくすることである理由を説明ここでバックツーバックこれは、アレイの選択の最初の例であるので、比較開始と関係の点の指標を選択します比較交換におけるベースインデックス、そう場合などの要素は、インデックスは、フロントの最初の比較をバックアップする場合、その後、最後の要素でなければならない開始点を選択し、上書きされるのではなく、保存する必要があります[ARRので右] =のARR [左]に割り当てられたときに保存されているように、それは、[右]前回値ARRを上書きしないであろう)
@ 2:比較及び置換が完了した後、選択された配列の中間点として値、及びそれを左へ、左=右の(すなわち、再帰的なクイックソートは、分割することによって達成され、ソートされた征服切断アレイに直接返されるため、それほど前者は、各配列の最後の要素は、ソートの場合にのみ、端部を切断するまで、アレイの左半分は、ステップを並べ替え繰り返し配列ソートステップの右半分)が、繰り返される2にアレイを必要とします
5 @:再帰終了条件が残る=右、すなわち配列の長さは、完成され、元の切断の配列、すなわち、インデックスは、最初の種類の一次配列は、より良好な値@再帰ステップ4を繰り返す得るためにいることを示し
PS:このアルゴリズムは、比較的不安定であり、最適化の方法を持っていると言われて、処理は、ドロップが発生し、最悪の場合の確率は、O(Nの最悪の場合の時間複雑さを指すようにすることができる2例)、その後自由研究