Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.Python.8-10.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1.2 Mб
Скачать

Сортировка выбором

Сортировка массива выбором осуществляется так:

  1. находим номер минимального значения в неотсортированной части массива;

  2. производим обмен этого значения со значением первой неотсортированной позиции (обмен не нужен, если минимальный элемент уже находится на данной позиции);

  3. продолжаем сортировку оставшегося списка, исключив из рассмотрения еще один элемент.

Пример сортировки выбором минимума на си

void choiseSortFunction(double A[], size_t N) {     for(size_t tmp_min_index = 0; tmp_min_index < N;                                   tmp_min_index++) {         //ищем минимум         for(size_t k = tmp_min_index + 1; k < N; k++) {             if (A[k] < A[tmp_min_index]) {                 double min_value = A[k];                 A[k] = A[tmp_min_index];                 A[tmp_min_index] = min_value;             }         }     } }

 

Пример сортировки выбором минимума на python

def SelectionSort(A):      for i in range(0, len(A) - 1):          # Среди элементов A[i:] выбираем наименьший          # Сохраняем его индекс в переменной min_idx          min_idx = i          for j in range(i + 1, len(A)):              if A[j] < A[min_idx]:                  min_idx = j          # Теперь поставим A[min_idx] на место A[i]          A[i], A[min_idx] = A[min_idx], A[i]

Можно модифицировать алгоритм — не сохранять индекс наименьшего из просмотренных элементов, а при просмотре элементов в срезе A[i:] обменивать очередной элемент A[j] местами с A[i], если A[j]<A[i]:

def SelectionSort(A):      for i in range(0, len(A) - 1):          for j in range(i + 1, len(A)):              if A[j] < A[i]:                  A[i], A[j] = A[j], A[i]

 

Пример сортировки выбором минимума на pascal

var

  a: array[1..1000] of longint;

  tmp_num, i, j, n, tmp: longint;

begin

  readln(n);

  for i := 1 to n do

    read(a[i]);

  for i := 1 to n - 1 do begin // n-1 раз проходимся по массиву, ставя "на место" очередной элемент

    tmp_num := i; //номер минимального среди элементов с индексами от i до n

    for j := i + 1 to n do

      if a[j] < a[tmp_num] then 

        tmp_num := i;

    swap(a[i], a[tmp_num]); //ставим найденный минимальный "на место"

  end;

  for i := 1 to n do

    write(a[i], ' ');

end.

Сортировка вставками

Сортировка вставками использует такой инвариант: первые элементы списка, то есть срез A[:i] уже отсортирован. А вот как устроен алгоритм добавления i-го элемента к уже отсортированной части. Здесь берется элемент A[i] и добавляется к уже отсортированной части списка. Например, пусть i = 5 и срез A[:i] = [1, 4, 6, 8, 8], а значение A[i] == 5. Тогда элемент A[i] == 5 нужно поставить после элемента A[1] == 4, а все элементы, которые больше 5, сдвинуть вправо на 1. Получится cрез A[:i + 1] = [1, 4, 5, 6, 8, 8]. Таким образом, при вставке элемента A[i] в срез A[:i] так, чтобы в результате получился упорядоченный срез, все элементы, которые больше A[i] будут двигаться вправо на одну позицию. А в освободившуюся позицию и будет вставлен элемент A[i]. При этом значение A[i] нужно сохранить в переменной, т. к. на место элемента A[i], возможно, будет записан элемент A[i – 1].

Получаем следующий алгоритм:

def InsertionSort(A):      for i in range(1, len(A)):          # В new_elem сохранили значение A[i]          new_elem = A[i]          # Начиная с элемента A[i - 1]          j = i - 1          # все элементы, которые больше new_elem          while j >= 0 and A[j] > new_elem:              # сдвигаем вправо на 1              A[j + 1] = A[j]              j -= 1          # На свободное место записываем new_elem          A[j + 1] = new_elem

Посчитаем сложность алгоритма сортировки вставками. Следует отметить, что если массив уже упорядочен, то все элементы останутся на своем месте и вложенный цикл не будет выполнен ни разу. В этом случае сложность алгоритма сортировки вставками — линейная, т. е. O(n). Аналогично, если массив «почти упорядочен», то есть для превращения его в упорядоченный нужно поменять местами несколько соседних или близких элементов, то сложность также будет линейной.