方言はソート迅速に解決しました

高速ソーティングアルゴリズムは、それはのように、アレイ内の任意の要素を選択することで、高速行をいう閾値、及びその後に要素のアレイを介して閾値未満左に、閾値よりも大きいが、最終的にこのようなものを完成、右側に置かれ、そして順次閾値素子部の周囲に再帰的に並べ替えることができます。

今、私たちは宇宙、我々は最も可能性の高い二つの新しい一時的な配列を考えると、このような4の臨界値として、データの並べ替えについての二つの部分に格納されている方法の複雑さを考慮せずに、そのようなソートで実現方法を考える、私たちアレイに4未満の、アレイは、別に4よりも大きい場合、その後サイクルが完了すると、アレイ内のすべての要素となるように、アレイの元の一時配列にデータ2をコピーします整然とした。しかし、最大のスペースの複雑さOこの種の(n)を。

今日は、私たちに直接コードに、別の空間計算量はO(1)操作、あまり話をしなかったされて話しています。

 public static void quickSort(int arr[],int left,int right){
        if(left>=right)return;

        int q=partition(arr,left,right);

        quickSort(arr,left,q-1);
        quickSort(arr,q+1,right);

    }

    private static int partition(int[] arr, int left, int right) {
        int sortIndex=left;
        int arrIndex=left;
        int pivot=arr[right];

        while (arrIndex<right){
            if(arr[arrIndex]<pivot){
                int tmp=arr[arrIndex];
                arr[arrIndex]=arr[sortIndex];
                arr[sortIndex]=tmp;
                sortIndex++;
            }
            arrIndex++;
        }
        arr[right]=arr[sortIndex];
        arr[sortIndex]=pivot;
        return sortIndex;
    }

配列arrは、左右ソートする請求とき、(配列の長さが6である場合、左右それぞれ0と5)の左右の境界ARRあるよりか等しい場合終了条件が直接返さ到達します。

今、我々は、アレイ見 6、2、3、5、1、4つの パーティション分割方法が実行される高速放電処理を行います:

                                                  6 2 3 5 1左4 = 0、右= 5
                    最初のパーティション2 3 1 4 6放置5 = 0右= 5
                    左第一再帰2 3 1 = 0、右= 2
                    第二隔壁132 = 2 = 0左右
                    >左= 0、右= 0秒再帰左 、右=を、 リターン終了条件に達する
                    = 2第再帰左3 2 = 1つの右
                    第3仕切左2 3 = 1つの右= 2
                    >左= 1つの右= 0第再帰左 =右、 リターン終了条件に達しました
                    >左= 2右= 2第再帰左 、右=、 リターン終了条件に到達した
                    第六の再帰左6 5 4 =右= 5
                    第四の隔壁5左6 = 4右= 5 、> =右から左達成することを終了条件戻り、
                    第再帰= 4の右= 3左>左 =右、 リターン終了条件に達した
                    左第再帰を= 5右= 5左> =右、 リターン終了条件に到達する

          上記高速ソートを行うの詳細な処理であります、として配列の最後の要素である閾値クイックソートするためには、最後のパーティションが完了アレイになったときに、それを見ることができる1、2、3、4、5、6は、順序付けられました。

今、アレイ上の私たちの最初のパーティションには、例えば、分割方法の実行を分析します:

                                
                                
                                          sortIndexピボット
            サイクル6235146及び比較例4は、6が4よりも大きい最初の、データのない交換
                                          arrIndex                             
                                                    
                                
                                          sortIndexは回動しない
            第二サイクル                    6 2         比較4,2 4未満、2。3および4 5 1 2、及び6データ交換 
                                                       arrIndex
                                                    
                                
                                                      sortIndexピボット
            3サイクル2        3 6         。5. 1及び4 4比較例3、3未満4,3、及び6のデータ交換である
                                                                 arrIndex         

                                                                                        
                                
                                                                ピボットsortIndex
            2. 3. 1. 6 5 4 4比較4サイクル目と、5以上4以下、データのない交換
                                                                            arrIndex

                                                                                        
                                                                sortIndexピボット
            第3サイクル2         6         5         1         4 1〜4及び比較未満、1~4、1~6、データが交換
                                                                                      arrIndex         
                                                     
                                                                                        
                                                                         sortIndexが旋回
            2 3 1 5 6 4 arrIndex = 6サイクルを 5 = 5、右、arrIndex <右これは、サイクルの終了を保持していない
                                                                                                arrIndex         
                                                     
                                                                                        

                                                                        sortIndex                  
            最後の3 1 2         。4         。6        5                      4および5のデータ交換
                                                                             ピボット     
                   
                                                     

上記で4臨界点 2、3、1、4、5、66、2、3、5、1となる、4詳細な処理が行わ、マーク赤高速放電がデータ交換中に起こります。

前記nは、それぞれ1-arrIndexフロント要素及び配列添字、反復臨界点比較4、重要度の低い点より、ターゲットがsortIndex交換素子と電流素子、及びsortIndex +は+1しました、またはしないであろう場合データ交換。上記実装工程から分かるように、いずれかの要素sortIndexデータ交換体を生じる4未満があるときはいつでも閾値4未満sortIndex添字インデックスを格納するために使用される、プラスされ、その結果場合にのみ完全トラバーサルsortIndex要素が配置される必要があり、4交換の臨界値は、臨界点の左半分に核となるアイデアに到達することができます4、効果の右半分は、高速行がある、4より大きく4未満であります

要約:

私の以前読んマージソートを見ることができ、クイックソートとマージソートのコードが非常に似ていますが、マージソート順序は、順序立てのソート、クイックソートにまとめ、その後、個々の要素とに分割することです単一の要素をソートしたときに全体のシーケンスが分割されます。また、上記仕切り方法で見ることができ、それは配列をソートし、空間的複雑度はO(1)であり、元の交換を比較することにより、追加のメモリ空間には適用されません。マージソートの必要性は、ソートに追加のメモリ空間を適用するために、空間的な複雑さはO(n)があります。それらの時間複雑性はO(ログn)、およびより高いマージソートメモリ使用率、高速行、マージソートの並列高速アプリケーションはより広範になるようであるからです。

公開された25元の記事 ウォン称賛51 ビュー20000 +

おすすめ

転載: blog.csdn.net/Royal_lr/article/details/103119925