Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обработка массивов.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
502.27 Кб
Скачать

Примеры решения задач на сортировку массивов

Пример 1. Дан одномерный массив. Каждый элемент содержит следующую информацию: фамилия и рост студента. Упорядочить студентов по возрастанию роста.

Входные данные – одномерный массив а, каждый элемент которого в качестве значения имеет пару данных различного типа. В языке Turbo Pascal такие элементы удобно описать с помощью типа запись, с двумя полями: типа string для фамилии и типа integer для роста. В программе этот тип назван student.

Выходные данные – отсортированный массив, который размещается в памяти в тех же ячейках, что и исходный, поэтому в программе обозначается тем же именем а.

Сортировка производится методом пузырька. При этом два соседних элемента упорядочиваются в порядке возрастания значений в поле rost. Для того, чтобы в случае необходимости поменять местами два элемента, нужна промежуточная переменная того же типа, что и элементы массива. Этой переменной в программе дано имя b. Так как при выводе на экран в списке вывода процедуры writeln могут быть лишь величины стандартного типа, а тип запись не является стандартным, приходится указывать каждое поле элемента массива по отдельности.

program m1;

const n=10;

type student=record

fam:string;

rost:integer;

end;

var a:array [1..n] of student;

b:student;

i,k:integer;

begin

for i:=1 to n do

begin write('Вводите фамилию');readln(a[i].fam);

write('вводите рост');readln(a[i].rost);

end;

{сортировка студентов по росту методом пузырька }

for k:=n downto 2 do

for i:=1 to k-1 do

if a[i].rost>a[i+1].rost then

begin

b:=a[i];

a[i]:=a[i+1];

a[i+1]:=b;

end;

for i:=1 to n do

writeln(a[i].fam,' ',a[i].rost);

end.

Пример 2. Дан массив A – массив целых чисел. Сформировать новый массив B из элементов массива A, кратных 5-ти, и отсортировать его по возрастанию.

Входные данные – одномерный массив а, элементами которого являются целые числа.

Выходные данные – отсортированный массив b, состоящий из тех элементов исходного массива a, которые кратны 5-ти.

Сортировка производится методом выбора. При этом элементы массива упорядочиваются в порядке возрастания. Для того, чтобы поменять местами два элемента, используются две переменные: min для сохранения самого элемента и imin для сохранения позиции этого элемента в массиве. Отсортированный массив выводится на экран в виде строки.

program m1;

const n=6;

type mas=array[1..n] of integer;

var a,b:mas;

s,min,imin,j,i:integer;

begin

writeln ('введите элементы массива');

for i:=1 to n do read(a[i]);

j:=1;

{формирование нового массива из элементов исходного массива, кратных 5-ти}

for i:=1 to n do

if a[i]mod 5=0 then begin b[j]:=a[i];j:=j+1; end;

j:=j-1;

{сортировка полученного массива методом выбора}

for s:=1 to j-1 do

begin

min:=b[s];

imin:=s;

for i:=s+1 to j do

if b[i]<min then

begin

min:=b[i];

imin:=i;

end;

b[imin]:=b[s];

b[s]:=min

end;

for i:=1 to j do write(b[i],' ');

end.

Пример 3. Дан одномерный массив размера n, состоящий из целых чисел. Упорядочить элементы этого массива так, чтобы расположить сначала четные, а потом нечетные элементы в порядке возрастания.

Входные данные – одномерный массив а, элементами которого являются целые числа. Выходные данные – отсортированный массив, в начале которого находятся отсортированные четные элементы, а затем отсортированные нечетные элементы. Элементы массива размещаются в памяти в тех же ячейках, что и исходный, поэтому в программе обозначаются тем же именем а.

Сортировка производится методом быстрой сортировки. Перед сортировкой четные элементы собираются в левую часть, а не четные элементы в правую часть массива. Для этого используется цикл repeat…until. А циклы while для переменных i и j используется для нахождения несоответствующих заданному условию четных и нечетных элементов соответственно. При сортировке элементы упорядочиваются по возрастанию. Отсортированный массив выводится на экран в одну строку.

program m1;

const n=6;

type mas=array[1..n] of integer;

var a:mas;

c,i,j,t:integer;

procedure sor(m,l:integer);

var i,j,x,t:integer;

begin

i:=m;j:=l;

x:=a[(m+l) div 2];

repeat

while a[i]<x do i:=i+1;

while a[j]>x do j:=j-1;

if i<=j then begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

i:=i+1;j:=j-1;

end;

until i>j;

if m<j then sor(m,j);

if i<l then sor(i,l);

end;

begin write('введите элементы массива');

for i:=1 to n do read(a[i]);

i:=1;j:=n;

{сбор четных элементов в правую часть массива, а нечетных в левую }

repeat

while a[i] mod 2=0 do i:=i+1;

while a[j] mod 2=1 do j:=j-1;

if i<=j then begin

c:=a[i];

a[i]:=a[j];

a[j]:=c;

i:=i+1;

j:=j-1;

end;

writeln('i=',i,' j=',j);

until i>j;

{сортировка элементов}

sor(1,j);

sor(i,n);

for i:=1 to n do write(a[i],' ');

end.

Пример 4. Дан массив А – массив чисел, записанных в 8-ой системе счисления. Отсортировать его в порядке убывания. Результат выдать в 8-ичной и 10-ичной системе счисления.

Входные данные – одномерный массив а, каждый элемент которого в качестве значения имеет целое число, заданное в 8-ичной системе счисления. Так как на языке Turbo Pascal для чисел 8-ичной системе отдельного типа не предусмотрено, поэтому числам присваиваем тип integer, а при вводе чисел вводим числа 8-ичной системы счисления.

Выходные данные – два отсортированных массива, один из которых размещается в памяти в тех же ячейках, что и исходный, поэтому в программе обозначается тем же именем а и состоит из чисел в 8-ичной системе счисления. Элементами второго массива, который в программе обозначается именем b, являются те же элементы массива а, только переведенные в 10-ичную систему счисления.

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

После того как массив a отсортирован, элементы массива переводятся в 10-ичную систему счисления с помощью цикла while по переменной k и записываются в массив b.

Массивы а и b выводятся в разные строки.

program m1;

const n=6;

type mas=array [1..n] of integer;

var a,b:mas;

k,i,j,p,c,t,f:integer;

begin writeln('введите элементы массива в 8-ичной системе счисления');

for i:=1 to n do read(a[i]);

{сортировка элементов массива методом вставки}

for i:=2 to n do

begin f:=a[i];

j:=1;

while (f>a[j]) do j:=j+1;

for k:=i-1 downto j do

a[k+1]:=a[k];

a[j]:=f;

end;

j:=1;

for i:=1 to n do

begin k:=a[i];t:=1;c:=0;

while abs(k)>=1 do begin

p:=k mod 10;

c:=c+p*t;

k:=k div 10;

t:=t*8;

end;

b[j]:=c; j:=j+1;

end;

for i:=1 to n do write(a[i],' '); writeln;

for i:=1 to n do write(b[i],' ');

end.

Пример 5. Дан одномерный массив, состоящий из слов. Отсортировать по возрастанию длины те элементы, в составе которых есть в знак "?".

Входные данные – одномерный массив а, каждый элемент которого строка состоящий из набора символов. Выходные данные – отсортированный массив, который размещается в памяти в тех же ячейках, что и исходный, поэтому в программе обозначается тем же именем а. Перед тем как начать сортировку массива, находим первую строку, в которой имеется знак "?". Если такого элемента в массиве не имеется, то на экран выводится сообщение об этом и выводится сам массив, а если есть такой элемент, начинается сортировка тех элементов массива, которые соответствуют данному условию. Сортировка производится методом выбора. При этом элементы упорядочиваются в порядке возрастания. Для того, чтобы в случае необходимости поменять местами два элемента, используются промежуточные величины: amin – переменная для временного размещения строки, min – для временного хранения длины слова, imin – для хранения позиции элемента в массиве. Элементы массива выводятся на экран в виде столбца.

program m1;

const n=5;

type mas=array [1..n] of string;

var a:mas; b:boolean;

k,i,s,t,imin,min:integer;

c,amin:string;

begin writeln('вводите элементы массива');

for i:=1 to n do readln(a[i]); b:=false;

i:=1;

while (i<=n) and not(b) do begin

c:=a[i];

for k:=1 to length(c) do

if c[k]='?' then b:=true;

i:=i+1;

end;

if not(b) then writeln('такого элемента в этом массиве нет') else begin

for s:=i-1 to n-1 do begin

b:=false;

c:=a[s];

for k:=1 to length(c) do

if c[k]='?' then b:=true;

if b then begin

amin:=a[s];

min:=length(a[s]);

imin:=s;

for t:=s+1 to n do begin

b:=false; c:=a[t];

for k:=1 to length(c) do

if c[k]='?' then b:=true;

if (length(a[t])<min) and b then begin

amin:=a[t];

min:=length(a[t]);

imin:=t;

end; end;

a[imin]:=a[s];

a[s]:=amin;

end; end; end;

writeln('массив результат');

for i:=1 to n do writeln(a[i]);

end.