Задать вопрос
Castle540
@Castle540

Почему не работает код в Free Pascal?

Почему не работает сортировка методом пузырька, помогите пожалуйста?

USES
   windows;

CONST
   Size=32000;

TYPE
   TArray=array[1..Size] of integer;

VAR
   start, stop, res:int64; (*счетчик для windows*)
   BaseArray: TArray;
   Result:real;
   i,j,k: integer;
   esize:longint;

Procedure FillArray;
   begin

      case t of (* t задает тип заполнения *)
      1:begin (* Упорядоченные *)
      BaseArray[1] := MaxNumber;
      for i := 2 to eSize do
      BaseArray[i] := BaseArray[i-1]-random(MaxNumber div Size)-1
      end;
      2:begin (* Обратный порядок *)
      BaseArray[1] := 1;
      for i := 2 to eSize do
      BaseArray[i] := BaseArray[i-1]+random(MaxNumber div Size)+1
      end;
      3: for i := 1 to eSize do (* Вырожденные *)
      BaseArray[i] := random(12)+1;
      4: for i := 1 to eSize do (* Случайные *)
      BaseArray[i] := random(MaxNumber)+1
      end;

   end;
Procedure Exchange(ind1,ind2:integer);
   var
      tmp: integer;
   begin
      tmp:=BaseArray[ind1];
      BaseArray[ind1]:=BaseArray[ind2];
      BaseArray[ind2]:=tmp;
   end;

Procedure Bubble;
   var
      UBound: integer;
      EndFlag: boolean;
   begin
      Ubound:=eSize-1;
      repeat
         EndFlag:=true;
         for i:=1 to Ubound do
            if BaseArray[i]<BaseArray[i+1] then begin
               Exchange(i,i+1);
               EndFlag:=false;
            end;
         dec(Ubound);
      until EndFlag;
   end;

Procedure Check;
   begin
      for i:=1 to eSize-1 do
         if BaseArray[i]<BaseArray[i+1] then begin
            WriteLn('Error! Ошибка сортировки');
            halt;
         end;
   end;

BEGIN
   QueryPerformanceFrequency(res);
   eSize:=1000;
   repeat
      FillArray;
      QueryPerformanceCounter(start);
      Bubble;
      QueryPerformanceCounter(stop);
      WriteLn('На ', eSize,' элементов затрачено ',(stop-start)/res:10:4,' секунд');
      Check;
      eSize:=eSize*2;
   until eSize=64000;
   j:=2;
   repeat
      eSize:=32000;
      Result:=0;
        for k:=1 to j do begin
         FillArray;
         QueryPerformanceCounter(start);
         Bubble;
         QueryPerformanceCounter(stop);
         Result:=Result+(stop-start)/res;
         Write('. ');
         Check;
        end;
      WriteLn;
      WriteLn('На ', eSize*j,' элементов затрачено ',Result:10:4,' секунд');
      j:=j*2;
   until j=64;
end.
  • Вопрос задан
  • 83 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы