Сортировка одного массива методом слияний, рекурсивный вариант

program SortSlian;
uses crt;
type mas=array[1..1000] of integer;
procedure Sliv(var a:mas;p,q : integer);
{процедура сливающая массивы, p-начало, q-конец}
var r,i,j,k : integer;
    b:mas;
begin
 r:=(p+q) div 2;{делим массив}
 i:=p;{начало левой половины}
 j:=r+1;{начало правой половины}
 for k:=p to q do{смотрим от начала до конца}
 if (i<=r) and ((j>q) or (a[i]<a[j])) then
 {переставляем элементы из половин в новый массив, упорядочивая пары}
  begin
   b[k]:=a[i];
   i:=i+1;
  end
 else
  begin
   b[k]:=a[j];
   j:=j+1;
  end ;
 for k:=p to q do
 a[k]:=b[k];
end;
{рекурсивная процедура сортировки, проверяет если осталось
больше одного элемента, повторяет слияние в левой или правой частях массива}
procedure Sort(var a:mas;p,q : integer); {p,q - индексы начала и конца сортируемой части массива}
begin
 if p<q then {массив из одного элемента тривиально упорядочен}
 begin
  Sort(a,p,(p+q) div 2);{сортируем левую половину}
  Sort(a,(p+q) div 2 + 1,q);{правую половину}
  Sliv(a,p,q);{сливаем две половины}
 end;
end;
var a:mas;
    n,i:integer;
begin
 clrscr;
 randomize;
 write('Размер массива n=');
 readln(n); {Определение размера массива A - N) и его заполнение}
 writeln('Исходный массив:');
 for i:=1 to n do
  begin
   a[i]:=random(50);
   write(a[i],' ');
  end;
 writeln;
 writeln;
 {запуск сортирующей процедуры, сортируем от первого до последнего элемента}
 Sort(a,1,N);
 {Вывод отсортированного массива A}
 writeln('Результат сортировки:');
 for i:=1 to n do
 write(a[i],' ');
 readln
end.
Теги:
сортировка, массив, рекурсия
Добавлено: 15 Сентября 2013 02:48:58 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...