注:この記事を参照https://www.cnblogs.com/chengxiao/p/6104371.html
ヒルソート原則
ヒルソートを説明する前に、まず問題挿入ソートを振り返る必要があります。どんなに種類際に、分散配列の挿入ソート、要素を比較動かし、挿入するためのステップバイステップではありません。例えば、[5,4,3,2,1,0]配列の第一の端部に戻るためには非常に激しい0、この順序を逆にし、N-1回必要な移動要素を比較します。この場合、シェルソートをリードしています。
ヒルソートは1959年に作られたソートアルゴリズムヒル(ドナルド・シェル)です。ヒルは、一種の改善とより効率的なバージョンの後に挿入するように簡単です、またソート挿入ソートです。このアルゴリズムは、最初の画期的なアルゴリズムはO(n ^ 2)の一つです。
シェルソート単位で記録パケット、ソートアルゴリズムの各直接挿入ソートを押すの主題です。インクリメントに減少増分減少し、より多くのデジタルそれぞれ含むとともに、ファイル全体をグループ化することを起こる、アルゴリズムは終了します。
ソートグラフィックヒル
我々は、/ WEが選択された増分シーケンスが表されている使用できる増分ギャップ=ギャップ/ 2を減少させるために連続するように、我々は増分ギャップ=長さ/ 2を選択し、ステップを並べ替え基本ヒル見{N 2、(N / 2)/ 2···1}増分配列。
色要素の集合に同じ元のデータ配列
初期増分ギャップ=長さ/ 2 = 5、配列全体が第一デジタル位置の開始から、すなわち5つのグループに分割されるように、後方+ N *同じグループ内のギャップ、その結果、5グループの最初の増分[8後、3]、[9,5]、[1,4]、[7,6]、[2,0]
、これらの5つのソートグループに挿入され、例えば、[8,3]挿入位置は、ソートスワップ[3,8]、[9,5]交換位置を挿入ソート[5,9]等が挙げられます。非常に小さい数を実行した後、アレイの前に配置されます。
次に、デルタギャップ= 5/2 = 2を減少させる続ける、アレイは二つのグループに分割され、すなわち、後方に第一のデジタル位置の開始+ N *同じグループ内のギャップ、衣服第インクリメンタルサーチ群2から[3,1,0,9,7]および[5,6,8,4,2]。図に示すように。
上記2つのグループは、[3,1,0,9,7]に、さらに挿入ソートした[0,1,3,7,9]となるであろう、[5,6,8,4,2]であります[2,4,5,6,8]、以下に示すなり、さらに配列全体を規則化度ことがわかります。
= = 1 2/2ギャップを増加させるためにさらに減少、今回は、アレイ全体は、図2に示すように、[0,2,1,4,3,5,7,6,9,8]のセットです。
上記の「マクロ」の後、全体の配列は、基本的に順序付けされています。その時点で、アレイ全体の挿入ソート、為替のわずかな量は、規則的な配列になるために。
コードの実装
1.スイッチング実装
1 / ** 2 *交换式排序 3 * @paramのアレイ 4 * / 5 パブリック 静的 ボイド SORT1(INT []配列){ 6 int型温度= 0 。 7 int型のカウント= 0 ; 8 のための(int型ギャップ= Array.lengthと/ 2;ギャップ> 0;ギャップ/ = 2 ){ 9 ための(int型のI =ギャップ; I <Array.lengthと; iは++ ){ 10 のint J = - ギャップ。 11 一方(J> = 0 &&配列[J]>配列[J + ギャップ]){ 12 // パケットを交換する必要がある 13である TEMP = ;配列[J] 14 配列[J] =配列[J + GAP]; 15 配列[J + GAP] = TEMP; 16 J - = GAP; 17 } 18である } 19 } 20 }
2.シフト型実装
1 / ** 2 *移位式排序 3 * @paramのアレイ 4 * / 5 パブリック 静的 ボイド SORT2(INT []配列){ 6 用(INTのギャップ= Array.lengthと/ 2;ギャップ> 0;ギャップ/ 2 = ){ 7 ため(int型のI =ギャップ; iは<Array.lengthと; iは++ ){ 8 INT insertValue = 配列[i]は、 9 INT insertIndex = I - ギャップ。 10 INTのstartIndex = insertIndex。 11 しばらく(insertIndex> = 0 && insertValue < 配列[insertIndex]){ 12 // 所在分组需做后移 13 アレイ[insertIndex +ギャップ] = 配列[insertIndex]。 14 insertIndex - = ギャップ。 15 } 16 であれば(insertIndex =!のstartIndex){ 17 、配列[insertIndex +ギャップ= insertValue。 18 } 19 } 20 } 21 }
コード分析
1)パケットサイズ、半分の方法の選択は、半分の元のパケットずつ続いて配列のサイズを決定するためのループのための第一の層は、パケットサイズが1になるまで
第1グループの第2のパケットの正確に1つの要素の第1の素子間隙我々の挿入ソートがあるため、2)ループ要素の第二の層は、ギャップは最初の要素から開始する理由(本明細書で説明開始からギャップを表します第二の要素を比較すると、最後の要素までソート順に)前方後方の挿入を開始します
3)切り替え、各パケットの挿入ソートループ(要素は、2つのスイッチング素子が、見つかった場合、式は、挿入要素よりも大きい要素の後方への移動をシフト見出さ挿入要素よりも大きいですギャップ位置、缶空き位置に挿入される最後の要素)
時間複雑
我々の分析からは、丘のソートは、増分シーケンスの選択は、直接ヒルソートのパフォーマンスに影響を与えるために非常に重要です。我々は増分上記配列を選択した{N / 2は、(N / 2)/ 2···1}、 (N ^ 2)最悪時間計算量は依然としてOのビットである、そのようなHibbardによって最適化としてシーケンス番号をインクリメント複合体は、(N- Oの最悪時間計算することを実証することができる3/2)。
アルゴリズムの効率を試験
前回のソートアルゴリズムと同じで、我々はまだ実行時間を確認するために、ソートするために挿入ソート方法を使用して、の100,000個の乱数の配列を生成しました。次のようにテストコード
1 公共 静的 ボイドメイン(文字列[]引数){ 2 のint []配列= 新しい INT [1000000 ]。 3 のためには、(int型 i = 0; iが1000000を<; Iは++ ){ 4 配列[I] =(INT)(Math.random()* 8000000 )。 5 } 6は 長い =の開始)(のSystem.currentTimeMillisします。 7 SORT2(アレイ) 8 のSystem.out.println( "总耗时=" +(のSystem.currentTimeMillis() - 開始))。 9 }
テスト結果
ヒルソートアルゴリズムは、より高速な挿入ソートよりも見ることができ、100 000データは約300ミリ秒かかる配列をソート。次に我々はそれがより効率的であるかどうかをソートするために高速なソートアルゴリズムを紹介しますか!我々はを楽しみにしています!
概要
丘を数回移動させる挿入ソートアルゴリズムを使用する場合、配列は、逆の順序でソートされるときに時間のかかる操作を解決するために、挿入ソートアルゴリズムの一種です。ヒルソートアルゴリズムは、アレイのコアは、各パケットの順序は、広い範囲にわたってより整然としたアレイを注文された後に、小規模のソートする最初のグループをソートします。パケットサイズが1に減少される場合には、実質的にソートする配列を命じており、その後、挿入ソートこの場合に、実行することを保証するために、その動きまたはより少ない交換の数、ソートの効率を向上させる目的を達成するために。
注:この記事を参照https://www.cnblogs.com/chengxiao/p/6104371.html