9. Организация программ со структурой вложенных циклов. Упорядочение элементов массива по возрастанию (убыванию) для различных типов данных. Упорядочение методом нахождения минимального (максимального) элемента, упорядочение методом пузырька.
Организация вложенных циклов.
Иногда цикл, называемый в данном случае внешним, может содержать в себе один или несколько внутренних, образуя так называемые вложенные циклы. Каждый из вложенных циклов, в свою очередь, может содержать вложенные в него циклы. Как внешние, так и внутренние циклы организуются по общим правилам организации циклических алгоритмов. Переменные внешнего и внутреннего цикла должны быть разными и изменяться таким образом, чтобы для каждого значения переменной внешнего цикла переменная внутреннего цикла приняла все оговоренные в цикле значения. При организации вложенных циклов необходимо строго следить за тем, чтобы цикл, начинающийся позже, заканчивался раньше. При этом передача управления "вовнутрь" цикла запрещена. Выход из цикла возможен после его естественного завершения или досрочно, например в результате проверки некоторого условия.
Сортировки (упорядочение):
Сортировка по возрастанию методом нахождения максимального элемента:
program sort_voz_max;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const nn=40;
var a:array[1..nn] of real;
amax:real;
n,imax,i,j:integer;
begin
writeln('Vvedite kolichestvo elementov');
readln(n);
writeln('Vvedite elementi massiva');
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to n-1 do
begin
amax:=a[1];
imax:=1;
for j:=2 to n-i+1 do
if a[j]>amax then
begin
amax:=a[j];
imax:=j
end;
a[imax]:=a[n-i+1];
a[n-i+1]:=amax;
end;
for i:=1 to n do
write (a[i]:6:1,' ');
writeln;
readln;
end.
Сортировка по возрастанию методом нахождения минимального элемента:
program sort_voz_min;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const nn=40;
var a:array[1..nn] of real;
amin:real;
n,imin,i,j:integer;
begin
writeln('Vvedite kolichestvo elementov');
readln(n);
writeln('Vvedite elementi massiva');
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to n-1 do
begin
amin:=a[i];
imin:=i;
for j:=i+1 to n do
if a[j]<amin then
begin
amin:=a[j];
imin:=j
end;
a[imin]:=a[i];
a[i]:=amin;
end;
for i:=1 to n do
write (a[i]:6:1,' ');
writeln;
readln;
end.
Сортировка по возрастанию методом пузырька (модифицированного):
program sort_voz_puz_mod;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const nn=40;
var a:array[1..nn] of real;
b:real;
n,i,k:integer;
flag:boolean;
begin
writeln('Vvedite kolichestvo elementov');
readln(n);
writeln('Vvedite elementi massiva');
for i:=1 to n do
read(a[i]);
readln;
k:=0;
repeat
k:=k+1;
flag:=true;
for i:=1 to n-k do
if a[i]>a[i+1] then
begin
b:=a[i];
a[i]:=a[i+1];
a[i+1]:=b;
flag:=false;
end;
until flag;
for i:=1 to n do
write (a[i]:6:1,' ');
writeln;
readln;
end.
Сортировка по возрастанию методом вставки:
program sort_voz_vstav;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const nn=20;
var a:array[1..nn] of real;
b:real;
n,i,j:integer;
begin
writeln('Vvedite kolichestvo elementov');
readln(n);
writeln('Vvedite elementi massiva');
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to n-1 do
begin
j:=i+1;
while (j>=2)and (a[j]<a[j-1]) do
begin
b:=a[j];
a[j]:=a[j-1];
a[j-1]:=b;
j:=j-1;
end;
end;
for i:=1 to n do
write (a[i]:6:1,' ');
writeln;
readln;
end.
Сортировка по убыванию методом нахождения максимального элемента:
program sort_yb_max;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const nn=40;
var a:array[1..nn] of real;
amax:real;
n,imax,i,j:integer;
begin
writeln('Vvedite kolichestvo elementov');
readln(n);
writeln('Vvedite elementi massiva');
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to n-1 do
begin
amax:=a[1];
imax:=1;
for j:=2 to n-i+1 do
if a[j]>amax then
begin
amax:=a[j];
imax:=j
end;
a[imax]:=a[n-i+1];
a[n-i+1]:=amax;
end;
for i:=1 to n do
write (a[i]:6:1,' ');
writeln;
readln;
end.
Сортировка по убыванию методом нахождения минимального элемента:
program sort_yb_min;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const nn=40;
var a:array[1..nn] of real;
amin:real;
n,imin,i,j:integer;
begin
writeln('Vvedite kolichestvo elementov');
readln(n);
writeln('Vvedite elementi massiva');
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to n-1 do
begin
amin:=a[1];
imin:=1;
for j:=2 to n-i+1 do
if a[j]<amin then
begin
amin:=a[j];
imin:=j
end;
a[imin]:=a[n-i+1];
a[n-i+1]:=amin;
end;
for i:=1 to n do
write (a[i]:6:1,' ');
writeln;
readln;
end.
Сортировка по убыванию методом пузырька (модифицированного):
program Project4_4_sort_yb_puz_mod;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const nn=40;
var a:array[1..nn] of real;
b:real;
n,i,k:integer;
flag:boolean;
begin
writeln('Vvedite kolichestvo elementov');
readln(n);
writeln('Vvedite elementi massiva');
for i:=1 to n do
read(a[i]);
readln;
k:=0;
repeat
k:=k+1;
flag:=true;
for i:=1 to n-k do
if a[i]<a[i+1] then
begin
b:=a[i];
a[i]:=a[i+1];
a[i+1]:=b;
flag:=false;
end;
until flag;
for i:=1 to n do
write (a[i]:6:1,' ');
writeln;
readln;
end.
Сортировка по убыванию методом вставки:
program sort_yb_vstav;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const nn=20;
var a:array[1..nn] of real;
b:real;
n,i,j:integer;
begin
writeln('Vvedite kolichestvo elementov');
readln(n);
writeln('Vvedite elementi massiva');
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to n-1 do
begin
j:=i+1;
while (j>=2)and (a[j]>a[j-1]) do
begin
b:=a[j];
a[j]:=a[j-1];
a[j-1]:=b;
j:=j-1;
end;
end;
for i:=1 to n do
write (a[i]:6:1,' ');
writeln;
readln;
end.
Дополнительные виды сортировки (упорядочения):
Heap сортировка:
program sort_heap;
{$APPTYPE CONSOLE}
const nn=40;
var a:array[1..nn] of integer;
procedure heap_sort;
var i,t:longint;
procedure fixdown(k1,k2:longint);
var t,j:longint;
begin
while 2*k1 <= k2 do
begin
j:=2*k1;
if (a[j]<a[j+1]) and (j<k2) then inc(j);
if a[k1]>=a[j] then break;
t:=a[k1]; a[k1]:=a[j]; a[j]:=t;
k1:=j;
end;
end;
begin
for i:=n div 2 downto 1 do fixdown(i,n);
for i:=n downto 1 do
begin
t:=a[1]; a[1]:=a[i]; a[i]:=t;
fixdown(1,i-1);
end;
end;
procedure init;
var i:longint;
begin
randomize;
for i:=1 to n do a[i]:=1+random(10);
end;
procedure print;
var i:longint;
begin
writeln;
for i:=1 to n do write(a[i]:3);
end;
begin
init;
print;
heap_sort;
print;
readln;
end.
Быстрая сортировка:
program sort_quick;
uses
crt;
const nn=40;
type mas=array[1..nn] of integer;
var a: mas; k: integer;
function Part(l, r: integer):integer;
var v, i, j, b: integer;
begin
v:=a[r];
i:=l-1;
j:=r;
repeat
repeat
dec(j)
until (a[j]<=v) or (j=i+1);
repeat
inc(i)
until (a[i]>=v) or (i=j-1);
b:=a[i];
a[i]:=a[j];
a[j]:=b;
until i>=j;
a[j]:=a[i];
a[i]:= a[r];
a[r]:=b;
part:=i;
end;
procedure QuickSort(l, t: integer);
var i: integer;
begin
if l<t then
begin
i:=part(l, t);
QuickSort(l,i-1);
QuickSort(i+1,t);
end;
end;
begin
clrscr;
randomize;
for k:=1 to 10 do
begin
a[k]:=random(100);
write(a[k]:3);
end;
QuickSort(1,n);
writeln;
for k:=1 to n do
write(a[k]:3);
readln;
end.