
Сортировка и поиск
Для решения многих задач удобно сначала упорядочить данные по некоторому признаку, т.е. провести сортировку. Это может быть сортировка массивов, записей, файлов. Сортировка массива – простейший вид сортировки (внутренняя сортировка), сортировка файлов(внешняя сортировка).
Рассмотрим сортировку массива методами:
простого выбора;
простого обмена (пузырьковая);
вставки.
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.
№ пары, т.е. элементы 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. Если совпадает, то средний элемент и есть эталон. Если нет, то либо:
x<среднего элемента, тогда все элементы правее среднего элемента можно исключить из рассмотрения в силу упорядоченности массива, и дальше делить только левую часть;
x>среднего элемента, тогда исключаем элементы левее среднего элемента и далее применяем метод к правой части.
Средний элемент в обоих случаях в дальнейшем не рассматривается.
Пример. 1 3 4 6 8.
x =6 – эталон.
a=1, b=n, c=(a+b)\2=(1+5)\2=3 – целочисленное деление.
A(c)=4.
x>A(c) – следовательно исключаем левую часть массива, рассматриваем массив: 6 8.
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;
Пример.
Массив A(n) отсортировать методом вставки;
Дан 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.