コミック:ヒルソートとは何ですか?



次の日----- -----







------------




のは、見てみましょう挿入ソートを


名前が示す挿入ソートは、順序付けられた領域の前に対応する位置に、大小関係に応じて、配列の各要素に、ソート処理です。


そのようなアレイ3の次の要素として大小関係に応じて、3つの要素がフロント領域を注文する前に挿入する必要があり、後方に移動対応の最初の3つの要素:









そしてように、挿入ソート(配列の長さ-1)回の合計となり、各ラウンドは以下のようにしました。



ソート平均時間複雑さの挿入はO(N-2 ^) このソートアルゴリズムは、効率的なソートアルゴリズムを複雑にしますが、明らかではないされていません。


だから、どのように挿入ソートにそれを最適化させることができますか?我々としても二つの特徴の挿入ソートから開始する可能性があります:


要素のほとんど1.は、小さなワークロードの挿入ソートを注文してきました

明白な結論は、配列要素の大半が順序付けられている場合には、その配列の自然の要素を比較し、頻繁に交換する必要はありませんです。


小さな要素の数、挿入ソートより少ない作業の場合には2

この結論は、より明白であり、nはnが小さい場合には、ワークロードの挿入ソートの二乗に比例し、その後、ワークロードのソートは当然はるかに小さいです。




元の配列にそれを前処理する方法は?科学者は、特定の配列するために、パケットを注文する巧妙な方法を考える「粗調整。」



いわゆるグループ化要素の二つのグループ間のスパンと、二百二十から一族元素を作ることであり、それは4のスパンである配列の全長の半分です。



示すように、素子5と素子9、エレメント2の8のセットと要素のセット、要素6及び要素1、要素3のセットと、第7族元素、4基の合計。


次に、我々は、直接挿入ソートでソートをすることができ、各グループの要素に依存しない並べ替えをしましょう。まれに、各グループ内の要素の数、およびワークロードの2つだけなので、少し挿入ソートなど。次のように各アレイの完了後にソート。



したがって、唯一のいくつかの簡単な交換の後、アレイのオーダーの全体的な程度は有意にその後の再直接挿入のための作業負荷が大幅に低減ソートように、改善されています。このアプローチは、元の配列の「粗調整」として理解することができます。


しかし、これはまた、我々はさらに、スパングループ分けを狭める上記の作業を繰り返すことができ、終了していません。スパンは2再族元素のスパンで半分元に低減されます。



示されるように、要素5,1,9,6のセット、2,3,8,7要素のセット、両者の合計。


次に、我々は、ソート、直接挿入ソートであることができ、各グループの要素に依存しないソートを可能にし続けています。次のように各アレイの完了後にソート。



この場合には、その後の配列決定のために道を開い規則正しいアレイの程度をさらに増加が、実行されます。


最後に、私たちは、スパンが1であるように、それだけでソート直接挿入したりすることがあります、パケットがさらに低減さまたがります。直接ワークロードのソートにする前に、粗調整のシリーズは、多くのことを低下した後、次のように、並べ替えの結果は以下のとおりです。




私たちは再櫛にパケットを注文するプロセス全体をしてみましょう:





思考の一種に、この徐々にパケット粗い、その後、直接のようにヒルソートアルゴリズムの発明によれば、コンピュータ科学者ドナルド・シェルは、名前を命名します。


上記スパン(4,2,1)で使用される基の例は、ヒルソートと呼ばれる増分を、増分はドナルドによって、我々が使用した例でバイナリ段階的増分を選択する様々な構造を有することができます髪シェルソートMingxiのErで提案されている平野方法は、呼ばヒル増分を




public static void sort(int [] array){    //希尔排序的增量    int d=array.length;    while(d>1) {        //使用希尔增量的方式,即每次折半        d=d/2;        for(int x=0;x<d;x++) {            for(int i=x+d;i<array.length;i=i+d) {                int temp=array[i];                int j;                for(j=i-d;j>=0&&array[j]>temp;j=j-d) {                    array[j+d]=array[j];                }                array[j+d]=temp;            }        }    }}public static void main(String [] args){    int[] array = {5,3,9,12,6,1,7,2,4,11,8,10};    sort(array);    System.out.println(Arrays.toString(array));}复制代码






我々はコピーする前に、かどうか4つの増分、又は2単位、任意の交換なしに、各セット内の要素にアイデアをグループ化する上記アレイ、見てください。我々は1に減少するまで、アレイは、道の直接挿入ソートに応じて調整されるインクリメントします。


このような配列のために、ヒルは、直接挿入ソートの作業負荷を軽減することができなかっただけでなく、並べ替え、しかし無駄にグループ操作のコストが増加します。



どのように物事のより効率的な方法を選択するかはヒルインクリメンタルなものですか?


その粗ないブラインドパケット、1以外の必要な「プライム」、すなわちない公約数として互いに当たりの増分を確保するためです。


だから、人々は増分のさまざまな方法を提案してきた、最も代表的には、あるHibbardの増分Sedgewick増分


Hibbardの次のように増分シーケンスは次のとおりです。

1,3,7,15 ......

用語式2 ^ K-1

最悪時間計算量をソートするように増分の丘の使用であるO(nは^(3/2))


Sedgewickの次のように増分シーケンスは次のとおりです。

1、5、19、41、109 ......

用語式9 * 4 ^ K - 9 * 2 ^ K + 1又は4 ^ K - 3 * 2 ^ K + 1

最悪時間計算量をソートするように増分の丘の使用であるO(nは^(4/3))


時間についてこれらの二つの増分複雑、いくつかの必要性は非常に複雑な数学的証明は、一部の人々は、一般的に、我々は一時的にもつれをない、と仮定します。



上記配列のうち、二つの要素5、最初の緑色の5,5の後にオレンジがあります。


我々は次に、ヒル増分、(4単位)粗いの最初のラウンドをグループ化した場合、緑色素子4は、バックオレンジ5を変更するために、要素5と交換されます。



(2単位)粗い第二ラウンドの後:



最終的な順位の結果:



ソート順を変更した後、私たちが見ることができる同じ要素5、ソートヒルで不安定なソート



- - -終わり - - -




この記事のように、世間の注目号歓迎プログラマ小さな灰色の時計に、よりエキサイティングなコンテンツを



2次元コードのプレスの注目へようこそ小さな灰色の英語を学び、英語だけでなく、学びます!



おすすめ

転載: juejin.im/post/5de087ede51d452515148003