Сортирвка с помощью прямого выбораСтр 1 из 3Следующая ⇒
Сортировка с помощью прямого включения. Такой метод широко используется при игре в карты. Элементы мысленно делятся на уже “готовую” последовательность а1, … , аi-1 и исходную последовательность. При каждом шаге, начиная с I = 2 и увеличивая i каждый раз на единицу, из исходной последовательности извлекается i- й элементы и перекладывается в готовую последовательность, при этом он вставляется на нужное место. В реальном процессе поиска подходящего места удобно, чередуя сравнения и движения по последовательности, как бы просеивать x , т. е. x сравнивается с очередным элементом aj , а затем либо x вставляется на свободное место, либо aj сдвигается вправо и процесс “уходит” влево. Обратите внимание, что процесс просеивания может закончиться при выполнении одного из двух следующих различных условий: 1. Найден элемент aj с ключом, меньшим чем ключ у x. 2. Достигнут левый конец готовой последовательности
ПРОГРАММА 2.1. ССОРТИРОВКА С ПОМОЩЬЮ ПРЯМОГО ВКЛЮЧЕНИЯ.
PROGRAM SI; VAR I,J,N,X:INTEGER; A:ARRAY[0..50] OF INTEGER; BEGIN WRITELN(‘Введите длину массива’); READ(N); WRITELN(‘Введите массив’); FOR I:=1 TO N DO READ(A[I]); FOR I:=2 TO N DO BEGIN X:=A[I]; A[0]:=X; J:=I; WHILE X<A[J-1] DO BEGIN A[J]:=A[J-1]; DEC(J) END; A[J]:=X END; WRITELN('Результат:'); FOR I:=1 TO N DO WRITE(A[I],' ') END. Алгоритм с прямыми включениями можно легко улучшить, если обратить внимание на то, что готовая последовательность, в которую надо вставить новый элемент, сама уже упорядочена. Естественно остановиться на двоичном поиске, при котором делается попытка сравнения с серединой готовой последовательности, а затем процесс деления пополам идет до тех пор, пока не будет найдена точка включения. Такой модифицированный алгоритм сортировки называется методом с двоичным включением ( binary insertion).
ПРОГРАММА 2.2. СОРТИРОВКА МЕТОДОМ ДЕЛЕНИЯ ПОПОЛАМ.
PROGRAM BI; VAR I,J,M,L,R,X,N:INTEGER; A:ARRAY[0..50] OF INTEGER; BEGIN WRITELN('Введи длину массива'); READ(N); WRITELN('Введи массив'); FOR I:=1 TO N DO READ(A[I]); FOR I:=2 TO N DO BEGIN X:=A[I];L:=1;R:=I; WHILE L<R DO BEGIN M:=(L+R) DIV 2; IF A[M]<=X THEN L:=M+1 ELSE R:=M END; FOR J:=I DOWNTO R+1 DO A[J]:=A[J-1]; A[R]:=X END; WRITELN('Результат:'); FOR I:=1 TO N DO WRITE(A[I],' ') END.
Анализ двоичного включения. Место включения обнаружено, если L = R. Таким образом, в конце поиска интервал должен быть единичной длины; значит, деление его пополам происходит I*log I раз. Таким образом:
C = Si: 1<=i<=n: [log I ] (2.7.)
Аппроксимируем эту сумму интегралом
Integral (1:n) log x dx = n*(log n – C) + C (2.8.) Где C = log e = 1/ln 2 = 1.4426… . (2.9.)
Сортирвка с помощью прямого выбора Этот прием основан на следующих принципах: 1. Выбирается элемент с наименьшим ключом. 2. Он меняется местами с первым элементом а1. 3. Затем этот процесс повторяется с оставшимися n-1 элементами, n-2 элементами и т.д. до тех пор, пока не останется один, самый большой элемент. Процесс работы этим методом с теми же восемью ключами, что и в таблице 2.1., приведен в таблице 2.2. Алгоритм формулируется так: FOR I:= 1 TO n-1 DO Присвоить k индекс наименьшего из a[I] … a[n]; Поменять местами a[I] и a[k]; END ПРОГРАММА 2.3. СОРТИРВКА С ПОМОЩЬЮ ПРЯМОГО ВЫБОРА. PROGRAM SS; VAR I,J,R,X,N:INTEGER; A:ARRAY[0..50] OF INTEGER; BEGIN WRITELN('Введи длину массива'); READ(N); WRITELN('Введи массив'); FOR I:=1 TO N DO READ(A[I]); FOR I:=1 TO N-1 DO BEGIN R:=I; X:=A[I]; FOR J:=I+1 TO N DO IF A[J]<X THEN BEGIN R:=J; X:=A[R] END; A[R]:=A[I]; A[I]:=X END; WRITELN('Результат:'); FOR I:=1 TO N DO WRITE(A[I],' ') END. Анализ прямого выбора. Число сравнений ключей (С), очевидно не зависит от начального порядка ключей. Для С мы имеем C = (n2 – n)/2 (2.10.) Число перестановок минимально: Mmin = 3*(n-1) (2.11.) в случае изначально упорядоченных ключей и максимально Mmax = n2/4 + 3*(n-1) (2.12.)
Определим Мavg . Для достаточно больших n мы можем игнорировать дробные составляющие и поэтому аппроксимировать среднее число присваиваний на i-м просмотре выражением Fi = ln i + g + 1 (2.13.) где g = 0.577216… - константа Эйлера. Среднее число пересылок Mavg в сортировке с выбором есть сумма Fi с i от 1 до n: Mavg = n*(g + 1) + (Si: 1<=i<=n: ln i) (2.14.)
Вновь аппроксимируя эту сумму дискретных членов интегралом
Integral (1:n) ln x dx = x*(ln x – 1) = n*ln (n) – n + 1 (2.15.)
Получаем приблизительное значение Mavg = n*(ln (n) + g) . (2.16.)
©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|