ヒル ソートは、最大数千のデータ項目の中規模の配列ソートに適しています。ヒル ソートは、時間計算量が O(n*logn) のクイック ソートや他のソート アルゴリズムほど高速ではないため、これに適しています。は、非常に大きなファイルのソートには最適な選択肢ではありませんが、ヒル ソートは、時間計算量が O(n²) である選択ソートや挿入ソートよりもはるかに高速で、実装が非常に簡単で、コードも短くなります。
ヒルソートも挿入ソートの一種で、最小値が最後にある場合、コピー数が多すぎるという問題を解決します。これも、間隔を増やすことによって行われます。挿入ソートの要素、およびこれらの間隔要素間で挿入ソートを実行する場合、これらのデータ項目が一度ソートされると、Hill ソート アルゴリズムはデータ項目間の間隔を減らしてから、それらを下方向にソートします。これらの並べ替えを実行するときのデータ項目間の間隔は増分と呼ばれ、通常は文字 h で表されます。
Hill によってソートされる配列の場合、開始間隔を大きくする必要があり、その後、間隔が 1 になるまで間隔を継続的に減少させる必要があります。
スペーサー配列:
間隔をあけたシーケンス内の数値の品質は、多くの場合重要であると考えられます。これらの数値には 1 以外の公約数がありません。この制約により、各ソート パスが、異なる間隔をあけたシーケンスに対して前のパスの効果を保持する可能性が高くなります。条件は、徐々に減少する間隔が最終的に 1 に等しくなることです。したがって、最後のパスは通常の挿入ソートです。
以下にリストされている例は、ルール h=h*3+1 から導出されています。
パッケージ com.jll.sort; パブリック クラス ShellSort { int[] int サイズ; public ShellSort() { this.size = size; } /** * @param args */ public static void main(String[] args) { ShellSort ss = new ShellSort(10); i=0;i<10;i++){ ss.arr[i] = (int) ((Math.random()*100)+1); System.out.print(ss.arr[i]+" " ); } ss.shellSort(); System.out.println("ソート後:"); System.out.print(ss.arr[i]+" "); } } public void shellSort(){ int h = 1; h<=size/3){ h = h*3+1; (;h>0;h=(h-1)/3){ for(int i=h;i<size;i++){ int temp = arr[i]; int j = i; while(j>h-1&&arr[jh]>temp){ arr[j]=arr[jh] } j-=h;