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

Сортировка и поиск

Для решения многих задач удобно сначала упорядочить данные по некоторому признаку, т.е. провести сортировку. Это может быть сортировка массивов, записей, файлов. Сортировка массива – простейший вид сортировки (внутренняя сортировка), сортировка файлов(внешняя сортировка).

Рассмотрим сортировку массива методами:

  1. простого выбора;

  2. простого обмена (пузырьковая);

  3. вставки.

1). Рассмотрим A(n). Чтобы отсортировать по возрастанию надо: из n элементов найти max и поменять его местами с последним, из оставшихся (n-1) элементов найти max и поменять местами с (n-1)-ым элементом и т.д. пока весь массив не будет отсортирован (либо из n элементов найти min и поменять с первым и т.д.).

Пример. 6 2 9 3; n=4;

1 шаг: i=4 –(рассмотрим весь массив), ищем max, ставим на последнее место.

6 2 9 3

=> 6 2 3 9; {9 на своем месте}

2 шаг: i=3 – (рассмотрим все элементы кроме последнего), ищем max, ставим на предпоследнее место.

6 2 3 9

=> 3 2 6 9. (6 и 9 на своем месте).

3 шаг: i=2 – (рассматриваем оставшиеся элементы), находим max и меняем местами.

3 2 6 9

=>2 3 6 9

– ответ (i=1 рассматривать не нужно, т.к. оставшийся элемент стоит на своем месте).

Т.е. внешний цикл for i:=n downto 2, где i – количество элементов в рассматриваемой части массива. Во внутреннем цикле надо организовать поиск max элемента a(k) и обмен элементов a(i) на a(k).

2). Заключается в обмене местами соседних элементов.

Пример. 6 2 9 3.

  1. № пары, т.е. элементы a(i), a(i+1)

k- № шага

1 шаг: i:=1 - 6 2 9 3 (обмен)

i:=2 - 2 6 9 3 (нет обмена)

i:=3 - 2 6 9 3 (обмен)

=> 2 6 3 9 (число 9 стоит на своем месте);

2 шаг: i:=1 – 2 6 3 9 (нет обмена)

i:=2 – 2 6 3 9 (обмен)

=> 2 3 6 9 (числа 6 и 9 стоят на своих местах);

3 шаг: i:=1 – 2 3 6 9 (нет обмена)

=> 2 3 6 9 (числа 3, 6, 9 стоят на своих местах);

Ответ: 2 3 6 9.

for k:=1 to (n-1) do

for i:=1 to (n-k) do

if a[i]>a[i+1] then {сравнение соседних элементов}

begin

{обмен};

end;

end;

end;

3). При сортировке вставкой вначале упорядочиваются 2 элемента массива. Затем выполняется вставка третьего элемента в соответствующее место по отношению к первым двум элементам, …, на очередном шаге i-ый элемент вставляется на соответствующее место в упорядоченном массиве из первых (i-1) элементов и т.д.

Пример. d c a b.

1 шаг: d c a b – рассмотрим первые два элемента d и с. ‘c’ ставится в нужное место,‘d’ – сдвигается, т.е. его индекс в массиве увеличивается на 1.

2 шаг: c d a b – рассмотрим первые три элемента, где первый и второй упорядочены. ‘a’ – ставится на нужное место,’c’ и ’d’ - сдвигаются.

3 шаг: a c d b – рассмотрим четыре элемента, где первые три упорядочены. ‘b’ – ставится на нужное место,’c’ и ’d’ - сдвигаются.

=> ответ: a b c d.

Существуют также другие методы сортировки: метод слияний, быстрая сортировка, пирамидальная и др.

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

Методы поиска:

1). Линейный, т.е. последовательный просмотр массива и сравнение очередного элемента с эталоном x.

2). Бинарный (делением пополам).

Пусть есть массив A(n) – отсортированный по возрастанию. Число x – эталон. Надо найти такое i, что A(i)=x, или сообщить, что эталона x в массиве нет. Идея метода в том, что находим средний элемент и сравниваем с эталоном x. Если совпадает, то средний элемент и есть эталон. Если нет, то либо:

  1. x<среднего элемента, тогда все элементы правее среднего элемента можно исключить из рассмотрения в силу упорядоченности массива, и дальше делить только левую часть;

  2. x>среднего элемента, тогда исключаем элементы левее среднего элемента и далее применяем метод к правой части.

Средний элемент в обоих случаях в дальнейшем не рассматривается.

Пример. 1 3 4 6 8.

x =6 – эталон.

  1. a=1, b=n, c=(a+b)\2=(1+5)\2=3 – целочисленное деление.

A(c)=4.

x>A(c) – следовательно исключаем левую часть массива, рассматриваем массив: 6 8.

  1. c=(a+b)\2=(4+5)\2=4.

A(c)=6, следовательно элемент найден, стоит на 4 месте.

Программа. Пусть A(n) – упорядоченный массив, x – эталон.

a:=1: b:=n: f:=false;

repeat

sred:=(a+b) div 2;

if a[sred]=x then f:=true;

if a[sred]<x then a:=sred+1 else b:=sred;

until (a>=b) or (f);

if f then writeln(‘найден эталон на’, sred, ‘месте’)

else writeln(‘эталон не найден’);

readln;

Пример.

  1. Массив A(n) отсортировать методом вставки;

  2. Дан A(n). Отобрать четные элементы и отсортировать их методом вставки.

Program sort_vstavka;

Uses crt;

Type ar=array[1..20] of integer;

Var a,c:ar;

i,j,n,k1:integer;

procedure vvod;

begin

writeln(‘введите размерность’);

readln(n);

for i:=1 to n do

a[i]:=-20+random(41);

writeln(‘исходный массив:’);

for i:=1 to n do

write(a[i]), ‘ ‘);

writeln;

end;

procedure vstavka_vozr (var b:ar; n1:integer);

var x:integer;

begin

for i:=2 to n1 do

begin

x:=b[i]; j:=i-1;

while (j>0) and (x<=b[j]) do

begin

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

j:=j-1; {сдвиг вправо}

end;

b[j+1]:=x; {вставка}

end;

writeln(‘после сортировки по возрастанию методом вставки’);

for i:=1 to n1 do

write (b[i], ‘ ‘);

writeln; writeln;

end;

begin {основная программа}

clrscr;

randomize;

vvod; vstavka_vozr(a,n);

vvod;

writeln(‘отобранный массив: ’);

for i:=1 to n do

if not(odd(a[i])) then

begin

k1:=k1+1;

c[k1]:=a[i];

write(c[k1], ‘ ‘);

end;

writeln;

vstavka_vozr(c,k1);

readkey;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]