ShellSort.pas 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. Program ShellSort;
  2. {‘®àâ¨à®¢ª  ˜¥«« , ã«ãç襭¨¥  «£®à¨â¬  ¯àאַ£® ¢ª«î祭¨ï, à §­¨æ  ¢ ⮬,
  3. çâ® ¯à®æ¥áá á®àâ¨à®¢ª¨ ¡ì¥âáï ­  T íâ ¯®¢, ¢ ª ¦¤®¬ ¨§ ª®â®àëå ¤¥« ¥âáï
  4. ®¤¨­ ¯à®å®¤ ¯àאַ£® ¢ª«î祭¨ï, ­® ⮫쪮 ­  í«¥¬¥­âë, ®âáâ®ï騥 ¤à㣠®â
  5. ¤à㣠 ­  h[i] í«-⮢ (i in [1..T] ¨ h[T] = 1)
  6. ’ ª¦¥ ¤«ï  «£®à¨â¬  ¯àאַ© ¢áâ ¢ª¨ 㤮¡­® ¨á¯®«ì§®¢ âì "¡ àì¥àë". „ ¡ë
  7. ¯à¨ ¯¥à¥¬¥é¥­¨¨ ­¥ ᢥàïâì ¨­¤¥ªá í«-â  á ­ ç «®¬ ¬ áᨢ , 㤮¡­®
  8. à áè¨à¨âì ¬ áᨢ ­  1 í«-â (¢ ¤ ­­®¬ á«ãç ¥ ­  h[1]) ¨ â㤠 ¯¨á âì í«-â,
  9. ª®â®à®¬ã ᮡ¨à ¥¬áï ¨áª âì ¬¥áâ®. ’ ª¨¬ ®¡à §®¬ à §¬¥à ¬ áᨢ  ¡ã¤¥â
  10. [-h[1]..TotalCount]. ‚á«¥¤á⢨¥ ¦¥« ­¨ï á®§¤ âì ã­¨¢¥àá «ì­ë©  «£®à¨â¬
  11. á ¨á¯®«ì§®¢ ­¨¥¬ ¤¨­ ¬¨ç¥áª¨å áâàãªâãà (­ ¬ § à ­¥¥ ­¥ ¨§¢¥áâ­® T ¨
  12. ᮮ⢥âá⢥­­® h[1]) ¡ã¤¥â ¨á¯®«ì§®¢ ìáï ᬥ饭­ ï ¨­¤¥ªá æ¨ï ¬ áᨢ 
  13. ( A[i] -> A[h[1]+i]).
  14. ˆá¯®«ì§ãîâáï ã«ãç襭¨ï „. Š­ãâ :
  15. h[k-1] := 3*h[k]+1;
  16. T := LOG(N,3)-1
  17. PS. � ¤¥îáì ¢¥áì íâ®â ¡à¥¤ ¯®¬®¦¥â ¢ ¬ à §®¡à âìáï ¢ ¯à¥¤«®¦¥­­®¬  «£®à¨â¬¥.}
  18. type
  19. item = word;
  20. const
  21. MaxCount = 65530 div SizeOf(item); {Œ ªá¨¬ «ì­®¥ ç¨á«® í«-⮢ ¬ áᨢ }
  22. TotalCount = 20000;
  23. type
  24. pArray = ^tArray;
  25. tArray = array [1..MaxCount] of Item;
  26. tIndex = 1..MaxCount;
  27. var
  28. T : tIndex; {—¨á«® "à §¡¨¥­¨©"}
  29. h : pArray;
  30. Fi : tIndex; {�¥ «ì­ë© ¨­¤¥ªá ¯¥à¢®£® í«-â  (­¥ ¡ àì¥à )}
  31. A : pArray;
  32. {--------------------------------------------------------------}
  33. Procedure Init; {“áâ ­ ¢«¨¢ îâáï ã«ãçè. Š­ãâ , ¨­¨æ. ¬ áᨢë}
  34. var
  35. i : tIndex;
  36. begin
  37. T := round(Ln(TotalCount)/Ln(3)-1); {(‘) Š­ãâ}
  38. GetMem(h,T*SizeOf(item)); {ˆ­¨æ. ¬ áᨢ à ááâ®ï­¨©}
  39. h^[T] := 1;
  40. for i := T-1 DownTo 1 do h^[i] := 3*h^[i+1]+1;
  41. Fi := h^[1]; {“áâ ­®¢¨¬ £«®¡. ¨­¤¥ªá "ᬥ饭­®£®" ᬥ饭¨ï}
  42. GetMem(A,(TotalCount+Fi)*Sizeof(Item)); {ˆ­¨æ «¨§¨à㥬 ®á­. ¬ áᨢ}
  43. {^^^ „«ï ¡ àì¥à®¢}
  44. end;{Init}
  45. {--------------------------------------------------------------}
  46. Procedure Done; {Žá¢. ¢áî ¯ ¬ïâì}
  47. begin
  48. FreeMem(h,T*SizeOf(Item));
  49. FreeMem(A,TotalCount*SizeOf(Item));
  50. end;{Done}
  51. {--------------------------------------------------------------}
  52. Procedure SetArray; {�à®æ¥¤ãઠ § ¯®«­¥­¨ï í«-⮢ ¬ áᨢ  á«ãç. ç¨á« ¬¨}
  53. var
  54. i : tIndex;
  55. begin
  56. Randomize;
  57. For i := 1 To TotalCount Do A^[Fi+i] := Random(65535);
  58. {^^^ ޝïâì ¡ àì¥àë}
  59. end;{SetArray}
  60. {--------------------------------------------------------------}
  61. {Žá­®¢­ ï ¯à®£à ¬¬ }
  62. Var
  63. i,j,k,m,s : tIndex;
  64. Times : pArray;
  65. x : Item;
  66. BEGIN
  67. Init;
  68. SetArray;
  69. GetMem(Times,T*SizeOF(Word));
  70. FillChar(Times^,T*SizeOF(Word),0);
  71. For m := 1 to T do
  72. begin
  73. k := h^[m]; {� ááâ®ï­¨¥ ¬¥¦¤ã í«-â ¬¨}
  74. s := Fi-k; {"¡ àì¥à"}
  75. For i := k+1 to TotalCount do
  76. begin
  77. x := A^[Fi+i]; {�«-â, á ª®â®àë¬ à ¡®â ¥¬}
  78. If S=Fi then S := Fi-k;
  79. inc(s);
  80. A^[s] := x; {“áâ ­®¢¨¬ "¡ àì¥à"}
  81. j := i-k; {�।ë¤ã騩 ç¥à¥§ à ááâ®ï­¨¥}
  82. while A^[Fi+j] > x do
  83. begin
  84. Inc(Times^[m]);
  85. A^[Fi+j+k] := A^[Fi+j]; {„¢¨£ ¥¬ ¬ áᨢ}
  86. dec(j,k);
  87. end;
  88. A^[Fi+j+k] := x;
  89. end;
  90. end;
  91. For i := 1 to TotalCount do
  92. begin
  93. if ((i-1) mod 10) = 0 then WriteLN;
  94. Write(A^[Fi+i]:7);
  95. end;
  96. WriteLN(#10#13'—¨á«® ¯¥à¥áâ ­®¢®ª ­  ª ¦¤®¬ íâ ¯¥:');
  97. for i := 1 to T do WriteLn(i,'(',H^[i],') -> ',Times^[i]);
  98. FreeMem(Times,T*SizeOF(Word));
  99. Done;
  100. END.