一般的なソートアルゴリズムの学習の概要

これは、スイッチ:http://www.codeceo.com/article/10-sort-algorithm-interview.html#0-tsina-1-10490-397232819ff9a47a7b7e80a40613cfe1

唯一の個人学習記録のために、侵略は削除します!

 

バブルソート

比較およびスワップ少数介して隣接する素子に交流の上部に。

5,3,8,6,4バブルソートのこの無秩序シーケンス。

第一の配列の5,3,8,4,6に前方に交換4に比べ前後、4及び6からバブリング。

同様5,3,4,8,6なり、4及び8をやりとり   

3と4は交換する必要はありません。

交換機3と5、3,5,4,8,6,3になります。

このようなバブルが終了されるだろう、最小の数3は、フロントにルーティング。

順番にバブルの残りのシーケンスは、順序付けられたシーケンスを取得します。バブルソートの時間計算量はO(n ^ 2)です。

/ ** 
     *バブルソートアルゴリズム
     * @paramのARR
      * / 
    パブリック 静的な 無効バブルソート(int型{[] ARR)
        (System.out.printlnは "ソートフロント:" );
         のためint型I:ARRを){ 
            のSystem.outを.PRINTが(私は "" + ;)
        } 
        のSystem.out.println(); 

        IFを(ARR == NULL || arr.length == 0 ){
             リターン; 
        } 
        ためINT I = 0; I <arr.length。 ++ I ){
             int型 J = arr.length - 1。J> I。j-- ){
                 場合(ARR [J] <ARR [J - 1 ]){
                     int型の一時=のARR [J - 1 ]。
                    ARR [J -1] =のARR [J]。
                    ARR [j]は = TEMPと、
                } 
            } 
        } 

        のSystem.out.println( "排序后:" )。
        以下のためにint型私は:ARR){ 
            System.out.print(私は "「+ )。
        } 
    }

 

選択ソート

思考の選択ソートとバブルソート、彼らが最初に最小の要素の後にソートしており、実際にやや似ています。しかし、バブルソートを比較することにより、異なるプロセスは、に隣接し、交換です。選択ソートは、全体の選択によってです。栗は、5,3,8,6,4単純選択ソートのランダム配列は、最初の並べ替え、それはなる、選択するために切り換えられ外部と交換5、3及び5〜5の最小数を選択しますシーケンスおよびスイッチング時間の残りの3,5,8,6,4、最終的にあなたが順序付けられたシーケンスを取得します。その同じ目的のために、実際に、それは、最適化された選択ソートバブルソートと見なすことができるが、唯一の選択を決定する際にソートのみ有意交換の数を減らすの最小数の前提の下で交換されます。選択ソート時間Oの複雑さ(N ^ 2)

パブリック 静的 ボイド selectSort(INT [] ARR){
         場合(ARR == NULL || arr.length == 0 ){
             返します
        } 
        INT minIndex = 0 以下のためにint型 i = 0; I <arr.length-1; iは++ ){ 
            minIndex = I。
            int型 J = I + 1、J <arr.length; J ++ ){
                 場合(ARR [J] < ARR [minIndex]){ 
                    minIndex = J。
                } 
            }
            もし(!minIndex = I){ 
                スワップ(ARR、I、minIndex)。
            } 
        } 
    } 

    パブリック 静的 ボイドスワップ(INT [] ARR、int型 I、int型のJ){
         int型の一時=のARR [I]。
        ARR [I] =のARR [J]。
        ARR [j]は = TEMPと、
    }

 

挿入ソート

挿入要素の位置を比較することにより、ソートの目的を達成するのに適しました。

5,3,8,6,4単純挿入ソートのこのランダムシーケンスは、第1の仮定は、最初の数の位置正しいです

3〜5と、フロントに、5後3,5,8,6,4に一方を移動させます

そして図8は図6に示すように、8の前に挿入8の移動の後に、4バック1に移動される5から出発して、フロント5に挿入され、移動しません。

回数を挿入すると、この番号の前の数字が注文されていることを確認することに注意してください。シンプルな挿入ソートの時間計算量はO(N ^ 2)です。

パブリック静的ボイドinsertSort(INT [] ARR){ 
IF(ARR == NULL || arr.length == 0){
返します。
}
ため(INT I = 1; I <arr.length; I ++){
int型J =。
INT目標=のARR [I]。//待插入的数

ながら(J> 0 &&ターゲット<ARR [J-1]){
//スワップ(ARR、J、J-1)。
// j--;
ARR [J] =のARR [J-1]。
j--;
}

[J] =目標をARR。
}
}

 

クイックソート

バブルソート隣接する要素を比較し、上部に最小バブル、およびクイックソートに切り替えることにより、比較および交換小数と丸みを帯びたことであり、上部に、また、多数のシンクのみならず、そのよう小数バブル以下。

栗の場合:5,3,8,6,4のこの無秩序シーケンスはすぐにソート、アイデアが基準数よりも少ない右ポインタを見つけることです、ポインタは、参照番号の交換をより大きく見つけるために残しました。

比較のためのベースラインとして5,3,8,6,4 5は、最終的には右5への移行よりも左小5 5より大きいに移動します。

J二つのポインタが5小さな停止に(?なぜ考える)、両端にJポインタスキャンを指している4 I、5,3,8,6,4最初のセット。それから私は、8 5より停止をスキャンします。為替I、Jの位置。

5,3,4,6,8ポインタjは、その後、ポインタjスキャン4 2出会うこの時点で、再び走査されます。停止します。次に図4およびベンチマークを入れ替えます。

第1分割5は5つの目標より右よりも小さくなっているに達した後4,3,5,6,8は左。反復配列順序付けた後、最終的に順序付けられたシーケンスを取得します。

質問への左上には、なぜJポインタは、それを移動する必要がありますか?最後の二つの手でベースライン位置を満たすために交換するために、満たすため、最初に、これは、参照番号の位置に応じて、絶対的なものではありません。最初の数は、一般に最終的な数を満たすために交換ベンチマークは、それが基準数よりもいくつかの小さな満たさなければならないので、それは、左側に、ベンチマークとして選択されます。だから、jのポインタは、第1の基準数よりも少数の少ないを見つけるために移動します。

クイックソートが不安定で、その時間の平均時間計算量はO(nlgn)です。

パブリック 静的 ボイドクイック(INT [] ARR、intです左、int型右){
         場合(左> = 右){
             返します
        } 
        INT pivotPos = パーティション(ARR、左、右)。
        クイックソート(ARR、左、pivotPos -1 )。
        クイックソート(ARR、pivotPos 1 、右)。
    } 

    プライベート 静的 int型のパーティション(INT [] ARR、intです左、int型右){
         int型 pivoKey = ARR [左]。
        INT pivoPointer = 左、
         一方(左< 右){
             一方が(左<右&& ARR [右]> pivoKey =){ // それが基準数よりも小さい値が見つかるまで、基準以上の辺の数が続く場合 
                right-- ; 
            } 
            一方(左<右&& ARR [左] <= pivoKey){  ++ ; 
            } 
            ;スワップ(ARR、左、右)
        } 
        (左ARR、pivoPointer)スワップ; // 最後の参照番号と左右のポインタ交換数満たす
        リターン左; 
    } 

    パブリック 静的 ボイドスワップ(INT [] ARR、int型 I、INT J){
         int型の一時=のARR [I]。
        ARR [I] =のARR [J]。
        ARR [j]は = TEMPと、
    }

 

おすすめ

転載: www.cnblogs.com/763977251-sg/p/11373235.html