2. Сортировка прямым выбором
Этот метод основан на следующем алгоритме.
1. Выбирается элемент с наименьшим ключом.
2. Он меняется местами с первым элементом а1.
3. Эти операции затем повторяются с оставшимися n—1 элементами, затем с n — 2 элементами, пока не останется только один элемент — наибольший.
Этот метод продемонстрирован на тех же восьми ключах в табл. 2.
Таблица 2.2. Пример сортировки простым выбором
Начальные ключи i=2 i=3 i=4 i=5 i=6 i=7 i=8 |
44 55 12 42 94 18 06 67 06 55 12 42 94 18 44 67 06 12 55 42 94 18 44 67 06 12 18 42 94 55 44 67 06 12 18 42 94 55 44 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 |
Программу можно представить следующим образом:
for i := 1 to п — 1 do
begin «присвоить k индекс наименьшего элемента из а[i]...
... а[п]»;
«поменять местами al и ak end
Этот метод, называемый сортировкой прямым выбором, в некотором смысле противоположен сортировке простыми включениями; при сортировке простыми включениями на каждом шаге рассматривается только один очередной элемент входной последовательности и все элементы готового массива для нахождения места включения; при сортировке простым выбором рассматриваются все элементы входного массива для нахождения элемента с наименьшим ключом, и этот один очередной элемент отправляется в готовую последовательность. Весь алгоритм сортировки простым выбором представлен в виде программы 2.3.
procedure straightselection;
var i,j,k: index; x: item; begin for i : = 1 to n–1 do begin k := i; x := a[i];
for j := i+l to n do
if a[j] .key < x .key then begin A: := j; x := a[j] end ;
a[k] := a[i]; a[i] := x; end end
Исходный массив
0,57 |
-0,11 |
0,27 |
0,48 |
0,05 |
-24,00 |
0,09 |
1,46 |
-0,39 |
-1,00 |
23 |
45 |
Этапы сортировки
0,57 |
-0,11 |
0,27 |
0,48 |
0,05 |
-24 |
0,09 |
1,46 |
-0,39 |
-1,00 |
23 |
45 |
-24 |
-0,11 |
0,27 |
0,48 |
0,05 |
0,57 |
0,09 |
1,46 |
-0,39 |
-1,00 |
23 |
45 |
-24 |
-1,00 |
0,27 |
0,48 |
0,05 |
0,57 |
0,09 |
1,46 |
-0,39 |
-0,11 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
0,48 |
0,05 |
0,57 |
0,09 |
1,46 |
0,27 |
-0,11 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,57 |
0,09 |
1,46 |
0,27 |
0,48 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,57 |
0,09 |
1,46 |
0,27 |
0,48 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,09 |
0,57 |
1,46 |
0,27 |
0,48 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,09 |
0,27 |
1,46 |
0,57 |
0,48 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,09 |
0,27 |
0,48 |
0,57 |
1,46 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,09 |
0,27 |
0,48 |
0,57 |
1,46 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,09 |
0,27 |
0,48 |
0,57 |
1,46 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,09 |
0,27 |
0,48 |
0,57 |
1,46 |
23 |
45 |
-24 |
-1,00 |
-0,39 |
-0,11 |
0,05 |
0,09 |
0,27 |
0,48 |
0,57 |
1,46 |
23 |
45 |
Код, реализующий сортировку прямым выбором
Sub Sort_min_прямой_выбор1()
'сортировка по возрастанию элементов массива помощью
'прямого выбора
'Nk - кол-во перестановок
Dim a!(1 To 25), i%, n%, j%, s!, s1!, k%, Nk%
n = 1 ' размерность массива определяется путем
'считывания данных из таблицы
While Cells(2, n) <> ""
a(n) = Cells(2, n)
n = n + 1
Wend
n = n - 1
' проверка считанных данных
'For i = 1 To n
'Cells(3, i) = a(i)
'Next i
' сортировка эл-тов массива по убыванию
For i = 1 To n - 1
s = a(i): k = i
For j = i + 1 To n
If s > a(j) Then
k = j
s = a(k)
End If
Next j
a(k) = a(i)
a(i) = s
' вывод этапов сортировки
'For j = 1 To n
' Cells(16, j) = a(j)
' Cells(16, j).NumberFormat = "0.00"
'Next j
Next i
'Cells(4, i) = a(i)
'Cells(4, i).Font.Italic = True 'оформление ячеек вывода
'Cells(4, i).Font.Bold = True ' стилем
'Cells(4, i).Font.Color = RGB(45, 255, 123)
'Cells(4, i).NumberFormat = "0.00"
'Nk = Nk + 1
For j = 1 To n
Cells(4, j) = a(j)
Cells(4, j).Font.Italic = True 'оформление ячеек вывода
Cells(4, j).Font.Bold = True ' стилем
Cells(4, j).Font.Color = RGB(45, 255, 123)
Cells(4, j).NumberFormat = "0.00"
Next j
End Sub
Sub CommandButton1_Click()
Sort_min_прямой_выбор1
End Sub
Анализ метода прямого включения.
Число сравнений ключей (Сi) при i-м просеивании самое большее равно i –1, самое меньшее – 1. если предположить, что все перестановки из n ключей равновероятны, то среде число сравнений равно – i/2. Число же пересылок (присвоения элемементов0 Mi = Сi +2 (включая барьер). Общее сило сравнений и пересылок:
Минимальные оценки встречаются в случае уже упорядоченной исходной последовательности элементов, наихудшие оценки — когда они первоначально расположены в обратном порядке.