方言はバブルソートの最適化を解消しました

        バブルソートの各2つの隣接するデータ比較した後、下降交換を昇順で、少なくとも毎にソート最小要素の降順に最大の要素の昇順で、最大または最小の要素(左から右へのデフォルトの順序付けを行うことです)繰り返しN回後に尾を移動するために、ソートが完了しています。

       私たちと仮定  2,5,1,3,4,6 この整数配列をソートします。

       当社初見の最適化の前にバブルソート:

 public static int[] bubbleSort(int a[]){
        int n=a.length;
        for(int i=0;i<n;i++){
            for(int j=0;j<n-i-1;j++){
                if(a[j]>a[j+1]){
                    int tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                }
            }
       
        }
        return a;
    }

注文方法: 

                                初期2,5,1,3,4,6
                                2,1,3,4,5,6第
                                1,2,3,4,5,6第
                                三1,2,3,4- 、5,6
                                第1,2,3,4,5,6
                                第1,2,3,4,5,6
                                第1,2,3,4,5,6

  結論:

        私たちは、元のバブルソート、時間のソート数見ることができる6回。二番目の配列が順序付けされた後、その3分の1が、第四、第五、第六の選別は不要です。

最適化後:

public static int[] bubbleSort(int a[]){
        int n=a.length;
        for(int i=0;i<n;i++){
            boolean flag=true;
            for(int j=0;j<n-i-1;j++){
                if(a[j]>a[j+1]){
                    int tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                    flag=false;
                }
            }
            if(flag)break;
        }
        return a;
    }

注文方法: 

                                初期2,5,1,3,4,6
                                最初の2,1,3,4,5,6
                                二1,2,3,4,5,6

 

 最適化分析:

       何のデータ交換がない場合、私たちは内側のループjの中で、フラグのブール変数を最適化するための主なプラスは、ローカル変数であるときに、特定のソートが発生、その後、我々は整数のこの配列は完全に注文に達したことを信じています。

      なぜそれはそうです:

        私たちは、上記のコードを最適化するために見て、第三のデータのやり取りの後に発生しませんでした。この時点で、以降I = 2 。N- = 6 、内部ループは、次のとおりのために(INT J = 0; J <3; J ++)   三つの要素れる前1,2,3隣接要素と、それぞれ、2、3 4 比較:検索は、データ交換の必要が生じずに、最初の4つの要素が完全に注文する必要があり、2つの要素は、すでに2つのデータの最大のバブルである、順序付けされ、特定のソートが実現しなかったときデータ交換は、我々は整数のこの配列が完全に命じ達していると信じています。

  結論:

        私たちは、回数の最適化のこの種のバブルソートを見ることができる2回。並べ替えの時間を短縮するために6回、4回のご注文の前に数を最適化されました。注意深い観察は、我々は数や配列減らすことがわかります  秩序の程度 に関連します。

        だから、秩序の程度は何か:名前が(昇順または降順)初期配列の数順序付けられていることを示唆している、我々は上記の持っている  2,5,1,3,4,6、デフォルトで左から右に、例えば、配列を限り、上記の要素は以下の順序の程度である順序対考えられる後者の要素、よりように、昇順  11、審査に送信する要素を興味のある学生に注文することができます。

       つまり、秩序の程度が高い、最適化されたソートの数が少なくなります。

拡張と発散:

     思考のこの種を最適化するための度合いに応じて実際には、すでにJDKに行われているのは、Arrays.sort()である  DualPivotQuicksort.sort()ソート、中国のセットを注文する際Collections.sort()メソッドである方法、呼ばれる二軸のベンチマーククイックソート、このアイデアは、次のコードを使用することです。

上記のコードは言う:配列注文の非常に高度である場合には、使用するマージ・アルゴリズムを規則的アレイをソートするために整然と配列、およびマージアルゴリズムが具体的であるように。

要約:

      我々は、アルゴリズムを使用する場合、最初にデータの特定のセットを満たし、その後、完全には理解されるまでラインによってコード行を解析します。ゴーでも、この問題を解決するための良い方法で解決するためのより良い方法を考えるためには、他のアルゴリズムに最適化された方法のこの世代かどうかについて考えること、そして最終的にリカバリディスクを合計していきます。

      我々は後に改めて考えるように考えての上記のサイクルを使用して任意の問題が発生したとき、私たちは徐々に問題解決能力はますます強くなり、思考の深さを増加させる、コードのバグが少なく、より多くの賃金との意志になります高いです。

    人気のポイントということ:Doがない心配、それの最初からではない患者、ハローワールドなります

 

 

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

おすすめ

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