heapsort.pp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. { Heapsort }
  2. program heapsort;
  3. uses SysUtils, Classes;
  4. const
  5. IM = 139968;
  6. IA = 3877;
  7. IC = 29573;
  8. var
  9. ary: TList;
  10. r : real;
  11. rr : ^real;
  12. N, i, LAST : longint;
  13. function gen_random(n : longint) : real;
  14. begin
  15. LAST := (LAST * IA + IC) mod IM;
  16. gen_random := n * LAST / IM;
  17. end;
  18. procedure myheapsort(n : longint; var ra : TList);
  19. var
  20. rr : ^real;
  21. rra : real;
  22. i, j, l, ir : longint;
  23. begin
  24. rra := 0;
  25. i := 0;
  26. j := 0;
  27. l := n shr 1 + 1;
  28. ir := n;
  29. while 1 = 1 do
  30. begin
  31. if l > 1 then begin
  32. Dec(l);
  33. rra := real(ra.Items[l]^);
  34. end
  35. else begin
  36. rra := real(ra.Items[ir]^);
  37. GetMem(rr, SizeOf(real));
  38. rr^ := real(ra.Items[1]^);
  39. ra.items[ir] := rr;
  40. Dec(ir);
  41. if ir = 1 then
  42. begin
  43. GetMem(rr, SizeOf(real));
  44. rr^ := rra;
  45. ra.items[1] := rr;
  46. exit;
  47. end;
  48. end;
  49. i := l;
  50. j := l shl 1;
  51. while j <= ir do begin
  52. if (j < ir) and (real(ra.items[j]^) < real(ra.items[j+1]^)) then
  53. Inc(j);
  54. if rra < real(ra.items[j]^) then begin
  55. GetMem(rr, SizeOf(real));
  56. rr^ := real(ra.items[j]^);
  57. ra.items[i] := rr;
  58. i := j;
  59. Inc(j, i);
  60. end
  61. else begin
  62. j := ir + 1;
  63. end;
  64. end;
  65. GetMem(rr, SizeOf(real));
  66. rr^ := rra;
  67. ra.items[i] := rr;
  68. end;
  69. end;
  70. begin
  71. if ParamCount = 0 then
  72. N := 1
  73. else
  74. N := StrToInt(ParamStr(1));
  75. if N < 1 then N := 1;
  76. LAST := 42;
  77. ary := TList.Create;
  78. ary.Capacity := N;
  79. r := 0.0;
  80. GetMem( rr, SizeOf(real) );
  81. rr^ := r;
  82. ary.Add( rr );
  83. for i:= 1 to N do begin
  84. r := gen_random(1);
  85. GetMem( rr, SizeOf(real) );
  86. rr^ := r;
  87. ary.Add( rr );
  88. end;
  89. for i:= 1 to N do begin
  90. r := real(ary.items[i]^);
  91. end;
  92. myheapsort(N, ary);
  93. r := real(ary.items[N]^);
  94. WriteLn( r:10:10 );
  95. ary.Free;
  96. end.