メモリは取り戻す - 挿入ソート(直接挿入ソートとシェルソート)

1.はじめに挿入ソート

レコードが順序付けられたシーケンスにソートされた行に挿入されたそれらのサイズキーに従ってソートされるたびに、記録の全ての行まで:挿入ソート、ソート、主要なアイデアは、「挿入」による方法の種類であります良いです。

直接挿入ソート、およびシェルソート:挿入は2を命じました


 

2.直接挿入ソート(直挿入ソート)

 

:プロセスの並べ替え
1.すべてのレコードを2つのエリアに分かれています。面積が注文し、無秩序地域。
2.注文した領域内の適切な位置に障害の最初のレコード。
3.障害のレコードがないまでになるまで2を繰り返します。

パブリック クラスStraightInsertionSort {

    パブリック 静的 ボイドメイン(文字列[]引数){
         int型 ARR [] = { 253649871 }。
        insertsort(ARR)。
        システム。アウト.println(Arrays.toString(ARR));
    }

    パブリック 静的 ボイド insertsort(INT [] ARR){
         int型のTEMP;
         // 第1の記録領域障害から(添字1)
        のためのINT I = 1 ; I <arr.length; I ++ ){
            TEMP = ARR [I]; //は現在のデジタルコンパレータを記録
             @ 順序付けられた領域を比較
            INT InsertIndex = - 1 ; // これはフラグであるに等しい-1時間が-1表さより大きい、いかなる挿入時間がないことを示し挿入位置
             // ここでは、記録位置をやっている命じ領域とソートレコードを取得した位置(InsertIndex)を挿入する必要がある
            ためINT J = I - 1。 ; J> = 0 && ARR [J]> TEMP; J - ){
                [JをARR + 1 ] = ARR [J]。
                insertIndex = J;
            }
            // ループ(順序付け運動記録の途中で、すなわちゾーン)上記のために実行されたとき、我々は電流を必要としていることを指定された場所に数字のセット順序付け
            IF(InsertIndex> = 0 ){
                ARR [insertIndex] = TEMP。
            }
        }
    }
}
[1、2、3、4、5、6、7、8、9]

  

ベスト:元の順序が正である場合、比較は移動時間0を記録する、唯一のn-1回を必要とし、時間計算量はO(N)であり、
最悪の場合:原稿を逆の順序でソートされ、比較する必要+ 2 + 3 + 4 + ... +(N-1) 倍と(N-1)N / 2] 、それはモバイル記録であるため、[(N-1)N / 2] 各比較時間記録を移動させ、時間計算量はO(N乗)が
直接挿入アルゴリズム安定したアルゴリズムである:別の言及が

 

この方法でInsertsort、我々はinsertIndex注文領域に挿入位置の領域を無秩序値を記録するために、このパラメータを使用するアウターループ。

その後、我々は、このパラメータの値jをinsertIndexを見つけることができますし、内側のループは常に-1相殺されるので、これをに変更することができます。

パブリック 静的 ボイド insertsort(INT [] ARR){
         int型のTEMP;
         // 第1の記録領域障害(添字1)の
        ためのINT I = 1 ; I <arr.length; I ++){ // 外部ループ 
            ARR = TEMP [I]は; // 比較の現在の数を記録
             @ 順序付けられた領域と比較
            INT Jを;
             // これは、実際の記録位置と挿入位置jを記録するために使用される順序付けられた領域(Jを作製するために主に常にオフセット-1)の位置
            のためには、(私はJが= - 1 ; J> = 0 && ARR [J]> TEMP; J){ // 循環 
                ARR [J + 1 ] = ARR [J]。
            }
            ARR [J + 1。 ] = TEMP; // ループ実行のために上があるかどうかに関係なく、私たちのjの値が-1常に少ない添字を挿入するための実際の必要性よりも
        }
    }

 


3.シェルソート

 

直接挿入アルゴリズムでは、我々は、基本的な順序をソートする場合はシーケンスは、その後、高効率直接挿入ソート2.少ないレコードの数がソートされる1.ことがわかったときに、高効率
(注基本的な順序いるとローカルローカルオーダーなど1,2,3,8,4,5,9,7,6、::順序は、このような基本的な順序などの2つの概念であり、6,7,8,9,1,2,3,4、地元発注)が挿入ソートの効率を向上させることができます

 


だから基本的な考え方は、ヒルを並べ替えることである。いくつかのサブシーケンスに分割するレコードをご注文の際、挿入ソート、各サブシーケンスのために、配列全体は、実質的に直接挿入ソートのレコード全体、その後、注文します。

 

詳細は、ヒルアルゴリズム特定を参照してください。

https://blog.csdn.net/qq_39207948/article/details/80006224
https://www.jianshu.com/p/40dcc3b83ddc

パブリック 静的 ボイドシェルソート(INT [] ARR){

        // 各増分は、配列の長さの半分である
        INT arrLength = arr.length;
         のためint型 GAP = arrLength / 2 ; GAP> 0 ; GAP = GAP / 2 ){
             ためINT Iは、GAPを=; I <arrLength; I ++ ) {
                 // 各配列の位置は、ソートされ、増分開始の不規則領域は、第1選別過ぎ渡すために、
                インサート(ARR、GAP、I)。
            }
        }

    }

    // 開始位置のstartIndexギャップ増加と不規則領域知る内部挿入ソートニーズ
パブリック 静的 ボイドインサート(INT [] ARR、INTギャップ、INT のstartIndex){
         // 書き込み、直接挿入ソートは類似していなければならない
        int型の TEMPを= ARR 【のstartIndex];
         INT J;
         // 比較ディスオーダー領域
        (J =のstartIndex - GAP; J> = 0 && ARR [J]> TEMP; J = J - GAP){
            ARR [J +ギャップ] = ARR [J]。
        }
        ARR [J +ギャップ= TEMP。
}

パブリック 静的 ボイドメイン(文字列[]引数){

        INT ARR2 [] = { 25364987156987411231585 }。
        シェルソート(ARR2)。
        システム。アウト.println(Arrays.toString(ARR2));
    }
[1、2、3、4、4、5、5、6、6、7、7、8、8、9、9、11、15、23、85]

  

 シェルソート、不安定なソート方法であり、

おすすめ

転載: www.cnblogs.com/lvsafe/p/12495771.html