Categorías: Todo - python - метод

por Артур Валиуллин hace 1 año

96

Сортировка

Эффективность быстрой сортировки напрямую зависит от выбора вспомогательного элемента, от которого зависит, насколько равномерно делится массив на части. Оптимальный случай наступает, когда массив делится на две равные части на каждом этапе, в то время как наихудший случай возникает, когда деление происходит на одну часть с одним элементом и другую с остальными.

Сортировка

A.sort ( key = lambda x: x % 10, reverse = True)

B = sorted ( A, key = lambda x: x % 10 )

def lastDigit ( n ): return n % 10 B = sorted ( A, key = lastDigit )

B = sorted ( A, reverse = True )

B = sorted ( A )

В отличие от многих популярных языков программирования, в Python есть встроенная функция для сортировки массивов (списков), которая называется sorted.

Если длина массива не больше 1, то ответ – это сам массив, сортировать тут нечего (строка 1). Иначе выбираем в качестве разделителя («стержневого элемента», англ. pivot) X случайный элемент массива (строка 2), для этого используется функция choice (в переводе с англ. – выбор) из модуля random.. В строках 3-5 с помощью генераторов списков создаем три вспомогательных массива: в массив B1 войдут все элементы, меньшие X, в массив BX – все элементы, равные X, а в массив B2 – все элементы, большие X. Теперь остается отсортировать списки B1 и B2 (вызвав функцию qSort рекурсивно) и построить окончательный список-результат, который «складывается» из отсортированного списка B1, списка BX, и отсортированного списка B2.

Скорость работы быстрой сортировки зависит от того, насколько удачно выбирается вспомогательный элемент X. Самый лучший случай – когда на каждом этапе массив делится на две равные части. Худший случай – когда в одной части оказывается только один элемент, а в другой – все остальные. При этом глубина рекурсии достигает N, что может привести к переполнению стека (нехватке стековой памяти).

В середине XX века математики и программисты серьезно занимались разработкой более эффективных алгоритмов сортировки. Один из самых популярных «быстрых» алгоритмов, разработанный в 1960 году английским учёным Ч. Хоаром, так и называется – «быстрая сортировка»

Еще один популярный простой метод сортировки, при котором на каждом этапе выбирается минимальный элемент (из оставшихся) и ставится на свое место.

Еще один популярный простой метод сортировки, при котором на каждом

этапе выбирается минимальный элемент (из оставшихся) и ставится на свое место.



самый «тяжёлый» элемент опускается в конец массива.

"Метод камня"

"Метод пузырька"

сначала поднимается «наверх» (к началу массива) самый «лёгкий» (минимальный) элемент, затем следующий и т.д.

import random def qSort ( A ): if len(A) <= 1: return A X = random.choice(A) B1 = [ b for b in A if b < X ] BX = [ b for b in A if b == X ] B2 = [ b for b in A if b > X ] return qSort(B1)+BX+qSort(B2)

def qSort ( A, nStart, nEnd ): if nStart >= nEnd: return L = nStart; R = nEnd X = A[(L+R)//2] while L <= R: while A[L] < X: L += 1 while A[R] > X: R -= 1 if L <= R: A[L], A[R] = A[R], A[L] L += 1; R -= 1 qSort ( A, nStart, R ) qSort ( A, L, nEnd ) qSort ( A, 0, N-1 )

for i in range(N-1): nMin = i for j in range(i+1,N): if A[j] < A[nMin]: nMin = j if i!= nMin: A[i], A[nMin] = A[nMin], A[i]

Еще один популярный простой метод сортировки, при котором на каждом

этапе выбирается минимальный элемент (из оставшихся) и ставится на свое место.

for i in range(N): for j in range(N-i-1): if A[j+1] < A[j]: A[j], A[j+1] = A[j+1], A[j]

for i in range(N-1): for j in range(N-2, i-1 ,-1): if A[j+1] < A[j]: A[j], A[j+1] = A[j+1], A[j]

Сортировка – это перестановка элементов массива в заданном порядке.

Сортировка

«Быстрая сортировка»

Сортировка обменами

Метод выбора

Сортировка в Python