вівторок, 13 березня 2018 р.

Алгоритм сортування 5 способами мовою Pascal








   

  Алгоритм сортування 5 способами мовою Pascal

program sorting;
const maxcnt=5;
type vector=array[1..maxcnt] of real;
var cmpcnt,swpcnt: integer;
  trace: boolean;

{  Допоміжна процедура друкування масиву }

procedure writevector(n: integer; m: vector);
var i: integer;
begin
  writeln('це перший елемент відсортованого рядка' , m[1]:6:2);
  for i:=2 to n do
writeln('  це m[', i, '] -ий елемент відсортованого рядка ', m[i]:6:2);
  writeln;
end;

  { Допоміжна функція порівняння елементів }
Function   less(a, b: real): boolean;
begin
  cmpcnt:=cmpcnt+1;
  if trace then writeln('Порівняння', a:6:2, ' з ', b:6:2);
  less:=a<b;
end;

  { Допоміжна процедура – обмін елементів }
procedure swap(var a,b:real);
var c:real;
begin
  swpcnt:=swpcnt+1;
  c:=a; a:=b; b:=c
end;

   { Найпростіший алгоритм сортування  - "бульбашка" }
procedure bubble(n: integer; var m: vector);
var i,j:integer;
begin
  for i:=n-1 downto 1 do
    for j:=1 to i do
      if less(m[j+1],m[j]) then begin
         swap(m[j],m[j+1]);
         if trace then writevector(n,m)
      end;
end;
  { Метод мінімального елемента мінімізує кількість перестановок }
procedure minelement(n: integer; var m: vector);
var i,j,k:integer;
begin
  for i:=1 to n-1 do begin
  { Знаходимо мінімальний елемент  з тих, що залишилось … }
    k:=i;
    for j:=i+1 to n do
      if less(m[j],m[k]) then k:=j;
  { і ставимо його на місце }
    if i<>k then begin
      swap(m[i],m[k]);
      if trace then writevector(n,m)
    end;
  end;
end;
 
{Метод вставки зменшує кількість порівнянь до    n*log2(n) }
procedure inserting(n: integer; var m: vector);
var i,a,b,c:integer;
  k: real;
begin
  for i:=2 to n do begin
    { У відсортованій частині  масиву шукаємо місце для чергового елемента}
    { метод ділення навпіл }
    a:=1; b:=i;
    k:=m[i];
    while a<b do begin
      c:=(a+b)div 2;
      if less(k,m[c]) then
         while b>c do begin
           m[b]:=m[b-1];
           b:=b-1
         end
      else a:=c+1
    end;
    m[a]:=k; swpcnt:=swpcnt+i-a;
    if trace then writevector(n,m);    end;  end;

  { Пірамідальне сортування – один з найефективніших алгоритмів }
procedure pyramidal(n: integer; var m: vector);
label 1,2;
var i,j,k,l: integer;
  v: real;
begin
  { Перший етап: побудова піраміди }
  if trace then writeln('Перший етап');
  for i:=2 to n do begin
    j:=i;
    repeat
      k:=j div 2;
      if less(m[k],m[j]) then swap(m[k],m[j])
      else goto 1;
      j:=k
    until j=1;
  1: if trace then writevector(n,m)
  end;
  { Тепер виконується умова m[i/2]>=m[i] для будь-якого  i>1 }
  { Другий етап: вилучаємо з піраміди вершину і переносимо в кінець масиву}
  if trace then writeln('Другий етап');
  for i:=n downto 2 do begin
    v:=m[1];
    j:=1;
    while 2*j<i do begin
      k:=2*j;
      if less(m[k],m[k+1]) then begin
         m[j]:=m[k+1];
         j:=k+1
      end else begin
         m[j]:=m[k];
         j:=k
      end;
      swpcnt:=swpcnt+1
    end;
    m[j]:=m[i];
    if 2*j>i then
      while j>1 do begin
         l:=j div 2;
         if less(m[j],m[l]) then goto 2;
         swap(m[l],m[j]);
         j:=l
    end;
    2: m[i]:=v; swpcnt:=swpcnt+1;
    if trace then writevector(n,m)
  end;
end;
  { Рекурсивний алгоритм швидкого сортування Хоора}
procedure hoor(a,b: integer; var m: vector);
var   i,j,c: integer;     k: real;
begin     if a<b then   begin      { Обираємо ключовий елемент }
    c:=(a+b) div 2;       k:=m[c];
    { ділимо масив на дві групи, порівнюючи з ключовим елементом }
    i:=a; j:=b;   
    repeat
      if (i=c) and (i<j) then begin swap(m[i],m[j]); c:=j end;
      if   not less(k,m[i])   then   i:=i+1
      else  begin
         swap(m[i],m[j]);         j:=j-1;
         if j=c then c:=i
      end
    until i>j;
    { Якщо друга група порожня – перносимо в неї ключовий елемент }
    If   i>b   then   i:=b;
    If   trace   then   writevector(b,m);
    {виконуємо сортування кожної частини}
    hoor(a,i-1,m);        hoor(i,b,m);     end;   end;

var
  n,i: integer;
  m: vector;
  ans: char;
begin
  repeat
    write('Введено розмір масиву(від 1 до ', maxcnt, '): ');
    maxcnt:=5+random(5)
  until (1<=n) and (n<=maxcnt);
  writeln('Введено масив випадкових чисел:');
  for i:=1 to n do
    m[i]:=2+random(159);
  readln;
  write('Показати процес роботи? (y/N) '); readln(ans);
  trace:=(ans='y')or(ans='Y');
  writeln('оберіть метод сортування:');
  writeln('1 - "Бульбашка"');
  writeln('2 – мінімальний елемент');
  writeln('3 – метод вставки');
  writeln('4 – пірамідальне сортування');
  writeln('5 – швидке сортування Хоора');
  cmpcnt:=0; swpcnt:=0;
  repeat
    readln(ans);
    case ans of
      '1': bubble(n,m);
      '2': minelement(n,m);
      '3': inserting(n,m);
      '4': pyramidal(n,m);
      '5': hoor(1,n,m);

    end;
  until (ans>='1') and (ans<='5');
  writeln('Всього виконано ', cmpcnt, ' порівнянь та ', swpcnt, ' перестановок');
  writeln(' Відсортований масив:');
  writevector(n,m)
end.
   


Немає коментарів:

Дописати коментар