Материал для практических занятий |
||
Решение задач из курса исследования операций опирается на ряд элементарных действий, среди которых основными являются операции сортировки , поиска и перебора. 6.1 Сортировка. Пусть дан файл, состоящий из записей f(1),f(2),....,f(n) Будем сортировать записи по некоторому полю Kf(i) (i=1...n)-ключ. Считаем, что ключи можно упорядочить по некоторому принципу, т.е. указать последовательность кто за кем стоит. Задача: найти такую перестановку записей, чтобы ключи располагались в неубывающем порядке f(11) f(12)... f(1n) (2) Kf(i1)<=Kf(i2)<=...<=Kf(in) (3) Для получения из файла (1) не нужно физического перемещения записей. Достаточно задать доступ к записям файла (1) в соответствии с порядком (3). Пример 1 2 3 4 5- номера 3 1 5 7 2 (1) 1 2 3 5 7 (2)-делается человеком создаем адреса 2 5 1 3 4 - индексный файл, показывающий в каком порядке нужно брать записи из исходного файла, чтобы получился возрастающий ряд. Методы сортировки: 1)сортировка пузырьком- производится сравнение соседних элементов снизу вверх попарно, элементы меняются местами, если они не удовлетворяют условию, т.е. образуют инверсную пару. Для полного выполнения процедуры понадобится n*n срaвнений. Инверсной парой называется пара элементов a(i) и a(j), для которой a(i)>a(j) при i<j. 2) среди n элементов находим самый малый, меняем его мeстами с первым элементом. Среди оставшихся (n-1) элементов находим самый малый и меняем его местом со вторым и т.д. Всего понадобится n(n-1)/2 операций. 3) сортировка методом Шелла. Делим весь массив элементов на N/2 групп по два элемента. Внутри группы сортируем элементы. Затем делим весь массив на N/4 группы по 4 элемента и опять сортируем и т.д. Всего понадобится N log N операций. Если число N нельзя представить в виде 2 в степени N, то в качестве N берется число большее числа элементов и кратное 2. Например, для группы из 5 элементов N=8, а для группы из 13 элементов N=16. Алгоритмы сортировки 1. Алгоритм упорядочения 1 (цел N, вещ таб А [1:N]) арг А,N рез таб А начало цел i,k,l; вещ М; k=1; пока k<N нц M=A[k];l=k;i=k+1; пока i<=N нц если М>A[i] то М=A[i];l=i все i=i+1; кц A[l]=A[k];A[k]=M;k=k+1; кц конец 2. алгоритм Шелла (цел N, вещ таб A[1:N]) арг А,N рез А начало цел i,j,k,l,M, вещ R k=1; пока k<N нц k=k*2 кц m1: k=k/2; если k<1 то переход на конец все M=N-k; i=1; пока i<=M нц j=i; пока j>0 нц l=j+k; если A[l]<A[j] то R=A[j]; A[j]=A[l];A[l]=R все j=j-k; кц i=i+1; кц переход на m1; конец 2. Алгоритм быстрая сортировка Хоара (сортировка с разделением) Идея: массив S(k),k=1...n, пусть x принадлежит S. Разбиваем массив на два непересекающихся непустых подмножества S1 и S2. Разбиение делаем так, чтобы в одном массиве S1 оказались все элементы не превосходящие x, a<=x, a принадлежит S1, а во втором массиве были все остальные элементы b>x,b из S2. 6 23 17 18 14 25 3 30 7 Выбираем средний элемент 14, как граничный , тогда в левой группе нужно переставить число 23 за число 18 , а во второй группе переставить число 7 за число 3 Практика 5 rem нахождение min и max элемента в массиве 10 dim a(10) 20 for i=1 to 0 30 read a(i) 40 next 50 data 26,13,7,9,31,71,5,5,8,2,11 60 b=a(19:c=a(1) rem max ,min 70 for i=2 to 10 80 if a(i)>b then b=a(i) 90 if a(i)<c then c=a(i) 100 next 110 print "максимальное число=";b 120 print "минимальное число=;c 130 end Если числа должны быть в массиве построены машиной, то используем генератор случайных чисел 30 a(i)=int(rnd*100): print a(i); Чтобы при каждом новом запуске числа менялись, добавим строку 7 randomize 1000 Для выхода из Бейсика: набираем system, затем нажимаем клавишу ввода. Сортировка пузырьком 5 randomize 1000 10 dim a(10) 20 for i=1 to 10 30 a(i)=int(rnd*100):print a(i); 40 next 50 for g=2 to 10 60 for t=1 to g step -1 70 if a(t)>a(t-1) then swap a(t),a(t-1) 80 next t 90 next g 100 for t=1 to 10 110 print a(t); 120 next Пример 39 54 3 89 73 63 58 97 54 31 97 89 73 63 58 54 39 31 3 swap меняет местами Алгоритм упорядочения 1 5 randomize 1000 10 input "введите размерность";n 10 dim a(n) 20 for i=1 to n 30 a(i)=int (rnd*100):print a(i) 45 print 40 next 50 for i=1 to n-1 60 m=a(k):l=k:i=k+1 70 if i>n then goto 100 80 if m>a(i) then m=a(i):l=i 90 i=i+1:goto 70 100 a(l)=a(k):a(k)=m 110 next 120 for i=1 to n 130 print a(i); 140 next алгоритм Шелла 10 randomize 1000 20 input"введите размерность";n 30 dim a(n) 40 for i=1 to n 50 a(i)=int(rnd*100):print a(i); 60 next 70 print 80 for k=1 to n-1 90 if k<n then k=k*2 100 next 110 k=int(k/2):print k:print 120 if k<1 then goto 190 130 m=n-k 140 for i=1 to m 150 j=i 160 if j<=0 then goto 170 170 l=j+k 180 if a(l)<a(j) then swap a(l),a(j) 190 j=j-k 200 goto 160 210 next 220 goto 110 230 for i=1 to n 240 print a(i); 250 next |
||