Javaのクイックソートとソート詳細マージ

クイックソート

アウトライン

バイナリツリーを横断する考えである前に、高速ソートアルゴリズムは、最終的には配列をソートするために、学びます。

利点:

アレイは、二分木を用いるバイナリ思考を有するので、それはソート高速でソートされた大量のデータのために

リミット

それだけでソートデータ格納構造(配列、ArrayListの、等)、ないチェーンのデータ構造の順序に適用します

アルゴリズムの考え方

そのような配列にI.ターゲットアレイ。データの場所以外の場所左に、アレイ内のすべてのデータが小さい場合、データは、位置データの位置を右側よりも大きいです。

アイデアの実現:

1.データの配列を削除する0

 
 

データは、0番目の位置より小さなデータの位置を通過する場合、アレイを横断する右端から出発2は、位置データは、ポインタの位置の下に左に割り当てられます。

 

3.トラバーサル方向を変更し、それがデータの左側に発見された場合、左から0より大きい位置データである横断開始、第2段位置に割り当てられた位置データは、ダウン滞在し、変化方向。

 

約添字一致するまで前記ステップ3ループは、横断
抽出された値の位置は、ドエルサイクルの終了時に、左右の手の位置0に割り当てられています

II。再帰的なアイデア、ソートの最終完了の描画順序トラバーサルの前に。

コードの実装

プライベートボイドクイックソート([]配列、INT開始、INT端をINT){
        場合{(> =始端)
            を返します。
        }
        INTキー=配列[開始]。
        ;開始=左int型
        int型右=終了。
        ブール方向=はtrue。
        L1:
        (左<右){ながら
            IF(方向){
                (I =右int型、私は>左; i--){
                    IF(配列[I] <キー){
                        アレイ[左++] =配列[i]は、
                        右= I;
                        !方向=方向。
                        L1を続けます。
                    }
                }
                左=右。
            }他{
                ため(私は左= int型、iが<右; iが++){
                    (配列[i]の場合>キー){
                        [I]配列[right--] =配列。
                        私は=左;
                        !方向=方向。
                        L1を続けます。
                    }
                }
                =右から左、
            }
        }
        アレイ[左] =キー。
        クイックソート(配列、開始は、左- 1)。
        クイックソート(1 +左アレイ、エンド)。

    }

テスト結果

@Test
    公共ボイドtestQuickSort(){
        int型[]配列=新しいINT [] {1、3、4、10、2、5、6、9、7、8}。
        クイックソート(アレイ、0、Array.lengthと- 1)。
        以下のために(INT i = 0; I <Array.lengthと; I ++){
            するSystem.out.println(配列[I])。
        }
    }

プリント

1
2
3
4
5
6
7
8
9
10

マージソート

アウトライン

ソートと同じクイックソートマージ、同じ参照バイナリ思考、O(n)との時間の複雑さ、および最善の方法の一つとしては、すぐにデータのソート大量のソートします。

アイデア解析

周りの二つの配列へのターゲット配列でソートマージ、約2のアレイを注文した後、ソートを達成するために、2つの配列をマージする必要があります。任意の配列は、配列の数にすべてのデータとすることができるため、各配列要素は一つだけであり、その後二十から二を組み合わせ。(そのため、メモリのオーバーヘッドのマージソートはクイックソート以上になります)

コードの実装

プライベートボイドマージ(INT []配列、左INT、右INT){
        IF(左> =右){
            返します。
        }
        INT半ば=(左+右)>> 1。
        マージ(アレイ、左、中)。
        マージ(アレイ、ミッド+ 1、右)。
        マージ(アレイ、左、中間、右+ 1)。
    }

    プライベートボイドマージ{([]配列INT、右INT、中間INT、左INT)
        INT leftSize =ミッド-左。
        int型rightSize =右-ミッド+ 1;
        INT [] leftArray =新しいint型[leftSize]。
        INT [] rightArray =新しいint型[rightSize]。
        System.arraycopyの(アレイ、左、leftArray、0、leftSize)。
        System.arraycopyの(アレイ、中間、rightArray、0、rightSize)。
        int型のインデックス=左;
        int型leftIndex = 0;
        int型rightIndex = 0;
        一方、(leftIndex <leftSize && rightIndex <rightSize){
            IF(leftArray [leftIndex <rightArray [rightIndex]){
                配列[インデックス++] = leftArray [leftIndex ++]。
            }他{
                配列[インデックス++] = rightArray [rightIndex ++]。
            }
        }
        一方(leftIndex <leftSize){
            配列[インデックス++] = leftArray [leftIndex ++]。
        }
        (rightIndex <rightSize){ながら
            [rightIndex ++]配列[インデックス++] = rightArray。
        }
    }

テストコード

@Test
    公共ボイドtestMergeSort(){
        int型[]配列=新しいINT [] {1、3、4、10、2、5、6、9、7、8}。
        マージ(アレイ、0、Array.lengthと- 1)。
        以下のために(INT i = 0; I <Array.lengthと; I ++){
            するSystem.out.println(配列[I])。
        }
    }

プリント

2
4
6
8
10

おすすめ

転載: www.linuxidc.com/Linux/2019-08/160014.htm