Пятница, 26.04.2024, 06:22
Блог учителя информатики и математики
О блогеМой профильРегистрацияВыходВход
Вы вошли как Гость · Группа "Гости" Приветствую Вас, Гость · RSS
Меню блога
Погода в нашем районе.

НАГРАДА

Как Вы считаете, должны ли дети ходить в школу в школьной форме?
Всего ответов: 2806
 
 Блог учителя
Главная » Статьи » Информатика » В помощь ученику

Сортировка методом слияний (13 урок, часть 2).

 Суть метода состоит в том, что массив разбивается на части, которые сортируются по отдельности, и в последующем составляются из нескольких уже упорядоченных массивов искомого массива. После того как части упорядочены, можно объединить их в одни другой упорядоченный массив , который потом объединяют в другой  упорядоченный массив, ну и наконец    объединяют  в один массив.

Для решения задачи сортировки эти три этапа выглядят так:


Сортируемый массив разбивается на две части примерно одинакового размера;

Каждая из получившихся частей сортируется отдельно, например — тем же самым алгоритмом;

Два упорядоченных массива половинного размера соединяются в один.

Слияние имеет большое практическое применение. Например у Вас есть 2 списка номеров телефонов , отсортированных по возрастанию и их нужно объединить в один список, тоже отсортированный по возрастанию. Перейдем к алгоритму- коду задачи на объединение двух упорядоченных массивов !



const  

  n1 = 5;

  n2 = 8;


var

  P: array [1..n1 + n2] of integer;

  M: array [1..n1] of integer;

  N: array [1..n2] of integer;

  i, j,l, x: integer;


begin

  writeln('Заполните массив M (ввод ', n1, ' элементов )');

  for i := 1 to n1 do

    read(M[i]);

  writeln('Заполните массив N (ввод ', n2, ' элементов )');

  for i := 1 to n2 do 

    read(N[i]);

j := 1;

l := 1;

for i := 1 to n1+n2 do

  if j>n1

    then

      begin

        P[i] := N[l];

        l := l+1;

      end

    else

      if l>n2

        then

          begin

            P[i] := M[j];

            j := j+1;

          end

        else

          if M[j]<=N[l]

            then

              begin

                P[i] := M[j];

                j := j+1;

              end

            else

              begin

                P[i] := N[l];

                l := l+1;

              end;

  

  for i := 1 to n1 + n2 do

      write(P[i]:3);

end.

 


 


Усложним задачку  (пример использования кода).


ДЗ. Составьте алгоритм, упорядочивающий элементы массива, стоящие на нечетных местах, в возрастающем порядке, а на четных - в убывающем.


 


Ну, а здесь, код-сортировка простым слиянием


 


Procedure MergeSort(name: string; var f: text);

          Var a1,a2,s,i,j,kol,tmp: integer;

              f1,f2: text;

              b: boolean;

          Begin

             kol:=0;

 

             Assign(f,name);

             Reset(f);

             While not EOF(f) do

               begin

                 read(f,a1);

                 inc(kol);

               End;

             Close(f);

 

             Assign(f1,'{имя 1-го вспомогательного файла}');

             Assign(f2,'{имя 2-го вспомогательного файла}');

 

             s:=1;

             While (s<kol) do

               begin

 

                 Reset(f); Rewrite(f1); Rewrite(f2);

                 For i:=1 to kol div 2 do

                   begin

                     Read(f,a1);

                     Write(f1,a1,' ');

                   End;

                 If (kol div 2) mod s<>0 then

                   begin

                     tmp:=kol div 2;

                     While tmp mod s<>0 do

                       begin

                         Read(f,a1);

                         Write(f1,a1,' ');

                         inc(tmp);

                       End;

                   End;

                 While not EOF(f) do

                   begin

                     Read(f,a2);

                     Write(f2,a2,' ');

                   End;

                 Close(f); Close(f1); Close(f2);

 

 

                 Rewrite(f); Reset(f1); Reset(f2);

                 Read(f1,a1); 

                 Read(f2,a2);

                 While (not EOF(f1)) and (not EOF(f2)) do

                   begin

                     i:=0; j:=0;

                     b:=true;

                     While (b) and (not EOF(f1)) and (not EOF(f2)) do

                       begin

                         If (a1<a2) then

                           begin

                             Write(f,a1,' ');

                             Read(f1,a1);

                             inc(i);

                           End

                         else

                           begin

                             Write(f,a2,' ');

                             Read(f2,a2);

                             inc(j);

                           End;

                         If (i=s) or (j=s) then b:=false;

                       End;

                     If not b then

                       begin

                         While (i<s) and (not EOF(f1)) do

                           begin

                             Write(f,a1,' ');

                             Read(f1,a1);

                             inc(i);

                           End;

                         While (j<s) and (not EOF(f2)) do

                           begin

                             Write(f,a2,' ');

                             Read(f2,a2);

                             inc(j);

                           End;

                       End;

                   End;

                 While not EOF(f1) do

                   begin

                     tmp:=a1;

                     Read(f1,a1);

                     If not EOF(f1) then

                       Write(f,tmp,' ')

                     else

                       Write(f,tmp);

                   End;

                 While not EOF(f2) do

                   begin

                     tmp:=a2;

                     Read(f2,a2);

                     If not EOF(f2) then

                       Write(f,tmp,' ')

                     else

                       Write(f,tmp);

                   End;

                 Close(f); Close(f1); Close(f2);

 

                 s:=s*2;

               End;

             Erase(f1);

             Erase(f2);

          End;

Категория: В помощь ученику | Добавил: Harchyov (27.11.2013)
Просмотров: 3117 | Комментарии: 3 | Рейтинг: 4.2/37
Всего комментариев: 3
1 Настя  
Сортировка методом слияний.
uses crt;
type mas=array[1..1000] of integer;
procedure Sliv(var a:mas;p,q : integer);
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);
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;
writeln('Введите размер массива');
readln(n);
writeln('Исходный массив:');
for i:=1 to n do
begin
a[i]:=random(50);
write(a[i],' ');
end;
writeln;
writeln;
Sort(a,1,n);
for i:=1 to n do
write(a[i],' ');
readln
end.

2 Лавриненко Михаил  
uses crt;
type a=array[1..1000] of integer;
var m: a;
i, j, t, nom, n: integer;
procedure S(m: a; n: integer);
begin
for i:=1 to n-1 do
begin
nom:=i+1;
t:=m[nom];
for j:=i+1 downto 2 do
begin
if (t<m[j-1]) then
begin
m[j]:=m[j-1];
nom:=j-1;
end;
end;
m[nom]:=t;
end;
for i:=1 to n do write(m[i], ' ');
end;
begin
read(n);
for i:=1 to n do
begin
read(m[i]);
end;
S(m, n);
readkey;
end.

3 Настя  
Составьте алгоритм, упорядочивающий элементы массива, стоящие на нечетных местах, в возрастающем порядке, а на четных - в убывающем.
uses crt;
type TArray=array [1..100] of integer;
var i,n:integer;M:TArray;
procedure FillArray(var t:TArray);
begin randomize;
for i:=1 to n do
t[i]:=random(100)-50;end;
procedure PrintArray (t:TArray;n:integer);
begin
for i:=1 to n do write (t[i]:5);writeln;
end;
procedure sortirovka(var t:Tarray);
var j,g,k:integer;
a,b:TArray;
begin k:=(n+1) div 2;
for i:=1 to k do a[i]:=t[2*i-1];
for i:=1 to n div 2 do b[i]:=t[2*i];
for i:=k downto 2 do
for j:=1 to i-1 do
if a[j]>a[j+1] then begin
g:=a[j];a[j]:=a[j+1];
a[j+1]:=g;
end;
for i:=(n div 2) downto 2 do
for j:=1 to i-1 do
if b[j]<b[j+1] then begin
g:=b[j];
b[j]:=b[j+1];
b[j+1]:=g;
end;
for i:=1 to n do
if i mod 2=1 then t[i]:=a[(i+1) div 2]
else t[i]:=b[i div 2];
end;
begin clrscr;
writeln ('Введите размер массива');
readln (n);
FillArray(m);
PrintArray(m,n);
Sortirovka(m);
PrintArray(m,n);
end.

Имя *:
Email *:
Код *:
Copyright MyCorp © 2024
Блог учителя Учительский портал