最初のコードを貼り付けます
1つの#include <stdio.hの> 2 の#define N 12である 3。 // 最後の要素の戻り統計配列インデックスの長手方向の長さ 4。 int型(長INT [N]){ 5。 ための(int型 I = 0 ;私は= Nを< ; I ++ ){ 6。 IF([I] == 0)を返す I-を1。; 7 。8 } 。9 } 10 // プリントアウトアレイ要素 。11 ボイド(表示INT [N]){ 12である ため(INT I = 0; I <Nで、Iは++ ){ 13は IF([I] =!0)のprintf(" %4D " 、A [I]); 14 15 } 16 } 17 // ヒルソートアップグレード挿入(ソーティング) 18 ボイド(シェルソートINT [N]){ 19。 int型の GAP =長さ(A)/ 2 ; 20は、 実行{ 21である INT TEMP = 0 ; 22である ため(int型 I = GAPと、私は=長さ(A)を<; Iは++ ){ 23れます 以下のための(int型 J = I; J> = GAP; = J-GAP){ 24 IF([GAP-J]> A [J])は{ 25 TEMP = A [J- GAP]; 26である [GAP-J] = [J]; 27 A [J] = TEMPと、 } 28 } 29 }のprintf(" %Dの\のN- "、ギャップ); // 各ギャップの出力値の印刷出力値サイクルが連続で1 4 2へ。 30 / =ギャップ2 ; 31である } ながら!=(ギャップ0); // ここで用いることができるループないwhileループのために使用することができる 32 } 33は、 INT(主ボイド{) 34は、 INT A [N] = { 2、3、467、1、22は、図3、図5、34され、図4、図7 ;} // 手動で生成されたアレイ 35 のprintf(" %Dの\のN- " 、長さ( A)); 36 シェルソート(A); 37 [ 表示(A); // 出力12334572234467結果が正しい 38は、 39 の戻り 0 ; 40 }
ヒルソートアルゴリズムは、3つの重要な値がギャップを選択したことに注意することは簡単であり、配列の添字I、Jとの隙間、の位置関係は、ギャップ== 1つの挿入ソートアルゴリズムでプログラムをに分解されたときことを確実にするために
763241サイクルへの単純なアレイは、一例として開始されると、ギャップが括弧G中、gと略記、I、Jの位置番号、初期ギャップ= 3、配列と、初期値0を添字[ ]私は場合ループは、ギャップがの値が変更され、最も外側のループにおけるギャップことに注意し、二つの要素が値を交換する必要が表します
[7](JG)6 3 [2](G、I、J)4 1 - > 2 [6](J-GAP)3 7(G)[4](i、j)は1 - > 2 4 [3](i、j)は、図7(G)6 [1](i、j)は//端からここで最初のサイクルI、ソート縮重簡単に挿入するための間隙/ 2 = 1 - > [2] (JG)[4](G、I、J)1 7 6 3 - > 2 [4](G)[1](I)7 6 3 - > [2](IG)[1](G 、i、j)は4 7 6 3 - > 1 2 4 7 6 3 2 >>> 1 --------ように4. 3. 6 7 ---- >> 123674 - > 123 467(3回の反復が実行されるサイクルI jが配列内の最後の位置を指すAを有します)