СОРТИРОВКА МАССИВОВ
Сортировка - это процесс размещения элементов заданного множества объекта в некотором определенном порядке, как правило, в порядке возрастания или убывания.
Способы сортировки Сортировка подсчетом Сортировка подсчетом Сортировка вставками Сортировка вставками Сортировка простым обменом Сортировка простым обменом (пузырьковая сортировка) (пузырьковая сортировка) Сортировка простым выбором Сортировка с разделением
Нажмите пробел
Метод. Каждый элемент массива сравнивается со всеми остальными. Место каждого элемента в отсортированном массиве зависит от числа элементов, меньших его. Если некоторый элемент превышает пять других, то его место в упорядоченной последовательности - 6. Следовательно, для сортировки необходимо сравнить попарно все элементы и подсчитать, сколько из них меньше каждого отдельного элемента. После этого все элементы исходного массива можно разместить на соответствующих им местах в новом, специально созданном массиве.
Используются следующие величины : i- Индекс рассматриваемого элемента j- k- Индекс элемента, с которым сравнивается рассматриваемый Число элементов, меньших рассматриваемого
Исходный массив А: Массив B: Задача : Расположить элементы массива в порядке возрастания в массиве B
Исходный массив А: Массив B:
Исходный массив А: A[1]:=5 если A[j]
Исходный массив А: K=1 Массив B: B[k+1]:=A[i] B[2]:=5
Исходный массив А: K=1 Массив B: B[k+1]:=A[i] B[2]:=5
Исходный массив А: Массив B:
Исходный массив А: Массив B: A[1]:=18 если A[j]
B[k+1]:=a[i] B[4]:=18 Исходный массив А: Массив B: K=3
B[k+1]:=a[i] B[4]:=18 Исходный массив А: Массив B: K=3
Исходный массив А: 18 5 Массив B:
Исходный массив А: 18 5 Массив B: A[1]:=3 если A[j]
Исходный массив А: 18 5 Массив B: B[k+1]:=a[i] B[1]:=3
Массив B: Исходный массив А: B[k+1]:=a[i] B[1]:=3
Массив B: Исходный массив А:
12 27 A[1]:=12 если A[j]
Исходный массив А: B[k+1]:= A[i] B[3]:=12 K=2 Массив B:
Исходный массив А: 27 B[k+1]:= A[i] B[3]:=12 K=2 Массив B:
Исходный массив А: 27 Массив B:
Исходный массив А: 27 A[1]:=27 если A[j]
Исходный массив А: 27 B[k+1]:=a[i] B[5]:=27 Массив B: K=4
Исходный массив А: B[k+1]:=a[i] B[5]:=27 Массив B: K=4
Программа на школьном алгоритмическом языке : алг cort (арг цел таб а [1:n], рез цел таб b [1:n]) нач цел i,j,k нц для i от 1 до n k:=0 нц для i от 1 до n если а[j]
Программа на Паскале : program inf1; uses crt; var i,n,j,k:integer; a,b:array[1..100] of integer; begin clrscr; randomize; write(Введите к-во элементов: ');readln(n); writeln(Исходный массив: '); for i:=1 to n do begin a[i]:=random(100); write(a[i]:4); end; writeln; for i:=1 to n do begin k:=0; for j:=1 to i-1 do if a[j]
Выполнение в Паскале PASCAL
При сортировке вставками из неупорядоченной последовательности элементов поочередно выбирается каждый элемент, сравнивается с предыдущим (уже упорядоченным) списком и помещается на соответствующее место в последнем.
Алгоритм сортировки массива методом вставок Нц для i от 2 до n Разместить элемент а [i] на соответствующем ему месте в предшествующей последовательности Кц
Размещение элемента массива на соответствующем ему месте в предшествующей, уже упорядоченной последовательности, может быть проведено двумя способами Можно последовательно сравнивать рассматриваемый элемент с элементом, расположенным слева от него, и обменивать из местами до тех пор, пока слева от перемещаемого элемента не окажется элемент, меньший или равный ему. Такой способ будем называть «сравнение и обмен». Можно сначала определить место, соответствующее рассматриваемому элементу в упорядоченной последовательности, а затем разместить его в этой ячейке, сместив соответствующие элементы на одну позицию вправо. Эту разновидность размещения назовем «поиск места и вставка».
Познакомься с тремя методами сортировки: «Поиск места и вставка» «Сравнение и обмен» «Бинарная вставка»
Сортировка массива методом «поиск места и вставка»
Сортировка этим методом производится последовательно, шаг за шагом 1) На К-м шаге считается, что часть массива, содержащая первые К-1 элементов, уже упорядочена, то есть А[1]
Рассмотрим этот процесс на примере. Пусть требуется отсортировать массив из 6 элементов по возрастанию:
Рассматриваем часть массива из одного элемента 13. Вставляем второй элемент массива 6 так, чтобы упорядоченность сохранилась. Так как 6
Возьмем третий элемент массива 8 и подберем для него место в упорядоченной части массива. 8 > 6 и 8 6 и 8
Следующий элемент Он записывается в упорядоченную часть массива на третье место, так как 11 >8, но 11 8, но 11 < 13 8
Далее, действуя аналогичным Далее, действуя аналогичным образом, определяем, что 3 необходимо записать образом, определяем, что 3 необходимо записать на первое место на первое место 3
Осталось подобрать подходящее место для последнего элемента Осталось подобрать подходящее место для последнего элемента 5 3
В процедуре, реализующей сортировку вставкой с таким вариантом размещения, целесообразно использовать две вспомогательные процедуры: 1) Find_Place - определяющую подходящее место элемента массива с индексом i в предшествующей ему упорядоченной части массива; 2) Insert- которая обеспечивает перемещение в массиве элемента с индексом i на j-ю позицию и смещение всех элементов с индексами от j до i-1 на одну позицию вправо.
program inf1; uses crt; var i,n,j,c:integer; a:array[1..100] of integer; procedure Swap(var a,b:integer); var c:integer; begin c:=a; a:=b;b:=c; end; begin clrscr; randomize; write( 'Введите количество элементов массива : ');readln(n); writeln( 'Исходный массив : '); for i:=1 to n do begin a[i]:=random(100); write(a[i]:4); end; writeln; {Выбираем последовательно элементы с индексами от 2 до n}
for i:=2 to n do if a[i]=a[j-1]) end; {Swap - процедура, выполняющая обмен значениями двух величин procedure Swap(var a,b:integer); var c:integer; begin c:=a; a:=b;b:=c; end;} writeln( 'Отсортированный массив : ' ); for i:=1 to n do write(a[i]:4); end. Запуск программы
Учитывая, что место для очередного размещаемого элемента с одинаковой вероятностью может находиться как во второй, так и в первой половине упорядоченной части, можно в процедуре Find_Place определять значение индекса j, идя от начала массива. Это позволит отказаться от использования «барьера» и всех связанных с ним уточнений программы. Приведем соответствующие процедуры. Find_Place (a:arrtype; i:integer); Procedure Find_Place (a:arrtype; i:integer);beginj:=1; while a[j]
Сравнительная характеристика вариантов метода вставок (продолжительность сортировки) Примечание 1,0 соответствует минимальному времени сортировки, остальные значения рассчитаны по отношению к минимальному в Количество элементов в массиве Вариант метода (способ размещения (способ размещения очередного элемента) N=1000N=2000N=4000 1,8 1,0 1,4 7,5 3,7 5,7 30,2 15,4 22,5 Cравнение и обмен Сравнение и обмен с «барьером» с «барьером» Поиск места и вставка
Размещение путем сравнения и обмена
Действия по размещению некоторого элемента, соответствующие этому варианту, могут быть оформлены в виде следующих команд: i - начальный индекс перемещаемого элемента; j - индекс, который этот элемент имеет в ходе перемещения;
если а[i]< а[i-1] { Если нужно перемещать элемент } то j:=i нцSwap (a[j],a[j-1]) { Смещаем его влево путем обмена } j:=j-1 { Новый индекс перемещаемого элемента } при j=1или а[j]>=а[j-1] кц всё
Swap - процедура, обеспечивающая обмен значениями двух величин: алг (арг рез цел a,b) нач цел с с:=а; а:=b; :b=с кон Примечание: Использование в условии окончания цикла дополнительного условия j=1 позволяем избежать сравнения j-го элемента с несуществующим j(-1)-м, что имеет место при j=1.
Можно также использовать цикл с предусловием: j:=i нц пока j>1и a[j],a[j-1] { Пока нужно перемещать i-й элемент} Swap(a[j],a[j-1]){ Смещаем его влево путем обмена} j:=j-1 { Новый индекс перемещаемого элемента} кц
Очевидно, что использование в процедурах дополнительного условия j=1 приводит к существенному увеличению времени выполнения программ ( для каждого элемента многократно проверяется дополнительное условие). Это недостаток можно устранить, если применить так называемый «барьер» : 4создать в сортируемом массиве элемент с индексом 0 ( расширив диапазон индексов в описании массива до 0…n) 4на каждом шаге сортировки присваивать ему значение, равное значению очередного размещаемого элемента
program inf2; uses crt; var i,n,j:integer; a:array[0..100] of integer; begin clrscr; randomize; write( 'Введите количество элементов массива : ');readln(n); writeln( 'Исходный массив : '); for i:=1 to n do begin a[i]:=random(100); write(a[i]:4); end; writeln; for i:=2 to n do if a[i]
a[0]:=a[i]; { Создадим "барьер "} j:=i; repeat begin a[j]:=a[j-1]; { Смещаем соседний слева элемент вправо } j:=j-1; end; until a[0]>=a[j-1];{ Место j, соответствующее элементу a[i], найдено } a[j]:=a[0] { На найденном месте размещаем элемент a[i]} end; writeln( 'Отсортированный массив : ' ); for i:=1 to n do write(a[i]:4); end. Запуск программы
Можно также ускорить работу, если в ходе размещения не проводить обмен значениями двух соседний элементов массива ( процедура Swap выполняет 3 операции присваивания!). Достаточно только смещать вправо на одну позицию элементы, меньшие рассматриваемого, а затем разместить последний на найденном для него месте. не проводить обмен значениями двух соседний элементов массива ( процедура Swap выполняет 3 операции присваивания!). Достаточно только смещать вправо на одну позицию элементы, меньшие рассматриваемого, а затем разместить последний на найденном для него месте. В случае, если элементы массива не отрицательные числа, механизм использования «барьера» упрощается. Достаточно только расширить нижнюю границу диапазона индексов массива до 0 и элементу а[0] присвоить нулевое значение. Он будет выполнять роль «барьера» для всех размещаемых элементов.
Сортировка методом бинарных вставок
Место, соответствующее некоторому элементу массива в предшествующей ему последовательности, можно найти значительно быстрее, пользуясь тем, что эта последовательность уже упорядочена. Для этого необходимо использовать так называемый бинарный поиск, который исследует средний элемент упорядоченной последовательности и продолжает деление пополам, пока не будет найдено место включения.
Разработаем функцию Binary_Search, определяющую индекс ячейки в упорядоченной части массива а, в которой должно размещаться некоторое число m. Упорядоченная часть массива имеет границы индексов 1..last. Обозначим i- индекс левого элемента исследуемого в ходе поиска отрезка массива, r - правого, mid - величину, равную (l+r)/2. В начале поиска принимаем l=1,r=last.
Определяем величину mid и сравниваем значения: a[mid] и m. Если a[mid]>m, то размещаемое число должно находиться в левой половине исследуемого диапазона, т.е. Можно принять r=mid-1, в противном случае - в правой половине - 1=mid+1. После этого процесс повторяется применительно к новому диапазону и заканчивается, когда r станет меньше 1. В этой ситуации искомый индекс равен значению 1.
Процедура Binary_Search на языке Паскаль имеет вид: Function Binary_Search (last:word;var a:arrtype;m:word):word; var l,r,mid:word;begin l:=1; r:=last; while lm then r:=mid-1 else l:=mid+1end; Binary_Search:=1 end;
Процедуры сортировки методом бинарных вставок, использующие приведенные функции, имеют вид: Procedure Binary_Insert_Sort(var a:arrtype); var i:integer; begin for i:=2 to n do if a[i]
Разновидность метода вставок, использующая бинарный поиск места размещения очередного элемента, называется сортировкой бинарными вставками. Сравним ее с методами сортировки простыми вставками.
Когда при сортировке простыми вставками на соответствующем месте размещается i-й элемент, то его значение сравнивается в среднем примерно с i/2 ранее отсортированными значениями, поэтому общее число сравнений при этом равно (1+2+…+n)/2=n*n/4, а это очень много, даже если n умеренно велико. При использовании же бинарного поиска места размещения очередного элемента число сравнений значительно меньше. Например, если очередной элемент - 64-й, то его значение сначала сравнивается с 37-м; затем с 16- м или 48-м и т.д., так что искомое место будет найдено максимум после всего лишь шести сравнений. Общее же число сравнений для n элементов равно приблизительно nlog2n,что существенно лучше, чем n*n/4.
Неприятность состоит в том, что бинарный поиск решает только половину задачи - после того, как мы нашли место очередного элемента, все равно нужно «вставить» этот элемент на найденное место и сместить некоторый отрезок упорядоченной последовательности на 1 позицию вправо. А поскольку в компьютере операция присваивания выполняется за значительно большее время, чем операция сравнения, то общая экономия времени будет незначительной, так что общее время работы при бинарном поиски, по существу, остается пропорциональным n*n/2.
CОРТИРОВКА ПРОСТЫМ ОБМЕНОМ - МЕТОД, ПРИ КОТОРОМ ВСЕ СОСЕДНИЕ ЭЛЕМЕНТЫ МАССИВА ПОПАРНО СРАВНИВАЮТСЯ ДРУГ С ДРУГОМ И МЕНЯЮТСЯ В ТОМ СЛУЧАЕ, ЕСЛИ ПРЕДШЕСТВУЮЩИЙ ЭЛЕМЕНТ БОЛЬШЕ ПРЕДЫДУЩЕГО. МЕТОД, ПРИ КОТОРОМ ВСЕ СОСЕДНИЕ ЭЛЕМЕНТЫ МАССИВА ПОПАРНО СРАВНИВАЮТСЯ ДРУГ С ДРУГОМ И МЕНЯЮТСЯ В ТОМ СЛУЧАЕ, ЕСЛИ ПРЕДШЕСТВУЮЩИЙ ЭЛЕМЕНТ БОЛЬШЕ ПРЕДЫДУЩЕГО.
В РЕЗУЛЬТАТЕ ЭТОГО МАКСИМАЛЬНЫЙ ЭЛЕМЕНТ ПОСТЕПЕННО СМЕЩАЕТСЯ ВПРАВО И В КОНЦЕ КОНЦОВ ЗАНИМАЕТ СВОЁ, КРАЙНЕ-ПРАВОЕ МЕСТО В МАССИВЕ, ПОСЛЕ ЧЕГО ОН ИСКЛЮЧАЕТСЯ ИЗ ДАЛЬНЕЙШЕЙ ОБРАБОТКИ. В РЕЗУЛЬТАТЕ ЭТОГО МАКСИМАЛЬНЫЙ ЭЛЕМЕНТ ПОСТЕПЕННО СМЕЩАЕТСЯ ВПРАВО И В КОНЦЕ КОНЦОВ ЗАНИМАЕТ СВОЁ, КРАЙНЕ-ПРАВОЕ МЕСТО В МАССИВЕ, ПОСЛЕ ЧЕГО ОН ИСКЛЮЧАЕТСЯ ИЗ ДАЛЬНЕЙШЕЙ ОБРАБОТКИ.
ЗАТЕМ ПРОЦЕСС ПОВТОРЯЕТСЯ, И СВОЁ МЕСТО ЗАНИМАЕТ ВТОРОЙ ПО ВЕЛИЧИНЕ ЭЛЕМЕНТ, КОТОРЫЙ ТАКЖЕ ИСКЛЮЧАЕТСЯ ИЗ ДАЛЬНЕЙШЕГО РАССМОТРЕНИЯ. Т АК ПРОДОЛЖАЕТСЯ ДО ТЕХ ПОР, ПОКА ВСЯ ПОСЛЕДОВАТЕЛЬНОСТЬ НЕ БУДЕТ УПОРЯДОЧЕНА. ЗАТЕМ ПРОЦЕСС ПОВТОРЯЕТСЯ, И СВОЁ МЕСТО ЗАНИМАЕТ ВТОРОЙ ПО ВЕЛИЧИНЕ ЭЛЕМЕНТ, КОТОРЫЙ ТАКЖЕ ИСКЛЮЧАЕТСЯ ИЗ ДАЛЬНЕЙШЕГО РАССМОТРЕНИЯ. Т АК ПРОДОЛЖАЕТСЯ ДО ТЕХ ПОР, ПОКА ВСЯ ПОСЛЕДОВАТЕЛЬНОСТЬ НЕ БУДЕТ УПОРЯДОЧЕНА.
Чтобы лучше разобраться в этом способе сортировки, рассмотрим идею метода на примере: Чтобы лучше разобраться в этом способе сортировки, рассмотрим идею метода на примере:
Отсортируем по возрастанию массив из 5 элементов: Длина текущей (неупорядоченной) части массива-(N-k+1), где k –номер просмотра, i-номер первого элемента проверяемой пары (в данном случае i=5), номер последней пары - N-k (например 4 и 9).
Первый просмотр: Первый просмотр: рассматривается весь массив. рассматривается весь массив. K=1 i i= >4-меняется i= меняется i=
Второй просмотр: рассматриваем часть массива с первого до последнего элемента. Второй просмотр: рассматриваем часть массива с первого до последнего элемента. K=2i= меняется i=
Третий просмотр: рассматриваемая часть массива содержит три первых элемента. Третий просмотр: рассматриваемая часть массива содержит три первых элемента. K=3i= ;4>2-меняется i=
Четвёртый просмотр: Четвёртый просмотр: Рассматриваем последнюю пару элементов. Рассматриваем последнюю пару элементов. K=4;i=
Наименьший элемент – 2 оказывается на первом месте. Количество просмотров элементов массива равно N-1 (в данном случае четырем). Наименьший элемент – 2 оказывается на первом месте. Количество просмотров элементов массива равно N-1 (в данном случае четырем). Этот метод также называют методом пузырька. Название это происходит от образной интерпретации, при которой в процессе выполнения сортировки более лёгкие элементы ( элементы с заданным свойством) мало- помалу всплывают наповерхность. Этот метод также называют методом пузырька. Название это происходит от образной интерпретации, при которой в процессе выполнения сортировки более лёгкие элементы ( элементы с заданным свойством) мало- помалу всплывают наповерхность.
program z1; var j,t,i,n:integer;a:array[1..100] of integer; begin randomize;readln(n);writeln(Исходный массив'); for i:=1 to n do begin a[i]:=random(100); write(a[i]:3);end;writeln; For i:= 1 to N-1 Do For j:= i+1 to N Do if A[i] > A[j] then Begin t:= A[i]; A[i]:= A[j]; A[j]:= t; End; for i:=1 to n do write(a[i]:3); readln; End. ПАСКАЛЬ
П РИ СОРТИРОВКЕ МЕТОДОМ ПУЗЫРЬКА ВЫПОЛНЯЕТСЯ П РИ СОРТИРОВКЕ МЕТОДОМ ПУЗЫРЬКА ВЫПОЛНЯЕТСЯ N – 1 ПРОСМОТРОВ, НА КАЖДОМ i-М ПРОСМОТРЕ ПРОИЗВОДИТСЯ N-i СРАВНЕНИЙ. О БЩЕЕ КОЛИЧЕСТВО ( С) РАВНО N*(N-1)/2, ИЛИ С =O(N^2). N – 1 ПРОСМОТРОВ, НА КАЖДОМ i-М ПРОСМОТРЕ ПРОИЗВОДИТСЯ N-i СРАВНЕНИЙ. О БЩЕЕ КОЛИЧЕСТВО ( С) РАВНО N*(N-1)/2, ИЛИ С =O(N^2).
Сортировка выбором. Сортировка выбором состоит в том, что сначала в неупорядоченной последовательности выбирается минимальный элемент. Этот элемент исключается из дальнейшей обработки, а оставшаяся последовательность элементов принимается за исходную, и процесс повторяется до тех пор, пока все элементы не будут выбраны. Выбранный в исходной последовательности минимальный элемент размещается на предназначенном ему месте упорядоченной последовательности несколькими способами:
Минимальный элемент после i-го просмотра перемещается на i-е место (i=1,2,3,…) другого массива, а в старом, исходном, на месте выбранного размещается какое-то очень большое число, превосходящее по величине любой элемент сортируемого массива. Изменённый таким образом массив принимается за исходный, и осуществляется следующий просмотр. Очевидно, что при этом размер обрабатываемого массива остается постоянным.
Минимальный элемент после i-го просмотра перемещается на i-е место (i=1,2,3,…) заданного массива, а элемент с i-го места – на место выбранного. После каждого просмотра упорядоченные элементы (от первого до элемента с индексом i) исключаются из дальнейшей обработки, т.е. размер каждого последующего обрабатываемого массива на 1 меньше размера предыдущего. Приведём процедуры, соответствующие обоим способам.
В процедуре сортировка выбором будем использовать две вспомогательные функции: 1)IndMin, определяющую индекс минимального элемента массива а. 2)Max, определяющую индекс максимального элемента массива а. Эти функции на школьном алгоритмическом языке имеют вид: алг цел IndMin (арг цел таб а[1:n] ) нач цел imin, i (imin-текущее значение искомой величины) imin:=1 imin:=1 нц для i от 2 до n нц для i от 2 до n если а[i]m то то m:=а[i] m:=а[i] всё всё кц кц знач:=m(значение функции) знач:=m(значение функции)кон Первый способ.
алг Choice_Sortl (арг рез цел таб а[1:n],рез цел таб b[1:n]) нач цел maximum,i,j (maximum-максимальный элемент сортируемого массива ) нач цел maximum,i,j (maximum-максимальный элемент сортируемого массива ) maximum:=Max(а) (определяем максимальный элемент) maximum:=Max(а) (определяем максимальный элемент) нц для i от 1 до n (n раз выполняем следующие действия) нц для i от 1 до n (n раз выполняем следующие действия) (в i-ю ячейку массива b записываем минимальный элемент массива а) (в i-ю ячейку массива b записываем минимальный элемент массива а) j:=IndMin(а); b[i]:=а[i] j:=IndMin(а); b[i]:=а[i] (а на месте последнего размещаем число, превосходящее любой (а на месте последнего размещаем число, превосходящее любой элемент исходного массива) элемент исходного массива) а[j]:=maximum+1 а[j]:=maximum+1 кц кц кон кон С использованием этих функций процедура заполнения массива b элементами из массива а в порядке их не убывания на школьном алгоритмическом языке оформляется следующим образом:
Процедура сортировки в Паскале procedure Choice Sortl(a:arrtype;var b:arrtype); var maximum,i,j:integer;(maximum – максимальный элемент сортируемого массива) begin maximum:=Max(a);(определяем максимальный элемент массива) for i:=1 to n do (n раз выполняем следующие действия) begin (в i-ю ячейку массива b записываем минимальный элемент массива а) j:=IndMin (a); b[i]:=a[i]; (а на месте последнего размещаем число,превосходящее любой элемент исходного массива) a[ j ]:=maximum +1; end; end.
В данной программе функции IndMin и Max имеют вид: (функция,определяющая индекс минимального элемента массива а) function IndMin (a:arrtype):integer; var i,imin:integer;(imin – текущее значение искомой величины) begin imin:=1; for i:=2 to n do if a[i]m then m:=a[i]; Max:=m; end;
Второй способ алг цел IndMin (арг цел таб а[1:n], цел start) нач цел i,imin (imin-текущее значение искомой величины) imin:=start нц для i от start+1 до n если а[i]
Таблица 1.Сравнительная характеристика способов сортировки выбором Как и следовало ожидать, второй способ сортировки выбором гораздо эффективнее первого: Способ Количество элементов в массиве n=1000n=2000n= ,77,028,4 1,04,0 15,7
Если же при сортировке первым методом не тратить время на определение значения максимального элемента массива (а считать его известным), то соотношения времени сортировки несколько изменится: Способ Количество элементов в массиве n=1000n=2000n= ,35,019,7 1,04,0 15,7 Таблица 1.Сравнительная характеристика способов сортировки выбором
Приведем алгоритм сортировки простым выбором:
Рассмотрим идею данного метода на примере. Пусть исходный массив состоит из 10 элементов: После сортировки массив должен выглядеть так:
? максимальный элемент текущей части массива ? элемент с которым происходит обмен рассматриваемая часть массива, т.е. ещё не упорядоченная ОБОЗНАЧЕНИЯ: Процесс сортировки будет состоять из 9-ти шагов.
Фрагмент программной реализации: procedure Sort; var i,j,k:integer; m:integer; (значение максимального элемента рассматриваемой части массива) begin for i:=N downto 2 do begin (цикл по длине рассматриваемой части массива) (поиск максимального элемента и его номера в текущей части массива) k:=i; m:=A[i]; (начальные значения максимального элемента и его индекса в рассматриваемой части массива) for j:=1 to i-1 do if A[j]>m then begin k:=j; m:=a[k]; end; if ki then ( перестановка элементов) begin A[k]:=A[i]; a[i]:= m; end; end; PROGRAM
Анохин Александр
Данный метод был предложен Ч.Э.Р. Хоаром в 1962 году. Этот метод обладает столь блестящими характеристиками с точки зрения времени выполнения, что Хоар назвал его БЫСТРАЯ СОРТИРОВКА
Идея метода: Допустим, исходный массив состоит из восьми элементов: В качестве барьерного элемента «X» возьмем средний элемент массива 7 Нашей целью является запись барьерного элемента « на своё место » в массиве, такое, чтобы слева от X были элементы, меньшие или равные X, а справа - большие X.
Наш массив : Сравнивая каждый элемент массива с барьерным элементом и производя необходимые перестановки, получаем: Теперь элемент 7 находится на своём месте
Производим необходимые перестановки. Наш массив: Продолжаем сортировку. Теперь перебираем следующие элементы массива, делая каждый из них барьерным Получаем:
Мы преобразовали исходный массив методом быстрой сортировки или, как её ещё называют, сортировки с разделением. Посмотрите как выглядит процедура быстрой сортировки на школьном алгоритмическом языке и на языке программирования Turbo Pascal.
нач цел i, j, x, w i: =m; j:=t; x:=a[(m+t) div 2] Алг QuickSort (арг цел m, t ) нц нц пока a[i]x Dec( j ) | уменьшаем указатель j | кц если ij если m
Язык программирования Pascal: Procedure QuickSort ( m, t : Integer ); Var i, j, x, w : Integer; Begin i:=m; j:=t; x:=a[ ( m+t ) div 2 ]; Repeat While A[ i ]x do Dec( j ); If ij; If m